内核模块程序:
#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
printk(KERN_WARNING"HELLO,WORLD/n");
return 0;
}
static int hello_exit(void)
{
printk(KERN_INFO"GOODBYE,WORLD/n");
}
module_init(hello_init); //装载模块函数
module_exit(hello_exit); //卸载模块函数
编译模块函数:makefile
可以作为模板
ifneq ($(KERNELRELEASE),) //如果不等于空运行obj-m := hello.o
obj-m := hello.o //模块名字 可修改
else
KDIR := /lib/modules/2.6.18-53.el5/build //指定内核代码所在目录 , 可修改
all:
make -C $(KDIR) M=$(PWD) modules //M 指定内核模块所在位置 PWD 当前目录 执行
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
多个内核模块编译:
ifneq ($(KERNELRELEASE),)
obj-m := mymodule.o //指定最终生成名字,只需替换名字
mymodule-objs := file1.o file2.o file3.o
else
KDIR := /lib/modules/2.6.18-53.el5/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
安装与卸载
insmod 安装 如: insmod hello.ko
rmmod 卸载 如: rmmod hello
查看模块:
lsmod
加载模块:
modprobe
同insmod 区别是: 可以自动先加载依赖的其他模块
模块可选信息:
1 ,许可证声明:
MODULE_LICENSE
2 , 作者声明:
MODULE_AUTHOR("SSS")
3, 模块版本
MODULE_VERSION("V1.0")
4, 模块描述
MODULE_DESCRIPTION("HELLO WORLD")
5, 模块别名
MODULE_ALIAS("A A")
6, 模块参数
module_param
module_param(name,type,perm)
name 模块参数名称,type参数的类型
perm 模块参数访问权限
type: bool布尔型 int整型 charp 字符串
perm : S_IRUGO 任何用户都对/sys/module/中出现参数具有读权限
S_IWUSR 允许root用户修改/sys/module 中出现的该参数
eg:
int a=3;
char*st;
module_param(a,int,S_IRUGO);
module_param(st,charp,S_IRUGO); //指明为字符串的模块参数
eg:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");
static int __init hello_init()
{
printk(KERN_EMERG"Hello World!/n");
return 0;
}
static void __exit hello_exit()
{
printk("<6>hello exit/n");
}
module_init(hello_init);
module_exit(hello_exit);