内核模块的经典结构
#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
printk(KERN_WARNING”hello,world!\n”);
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO”Goodbye,world\n”);
}
module_init(hello_init);
module_exit(hello_exit);
这里没有main()函数,程序的入口是module_init()指定的。
当我们使用insmod安装模块时,hello_init()函数即被调用。
当我们使用rmmod卸载模块时,hello_exit()即被调用。它是由module_exit()指明的。
内核模块的三要素:
1.加载函数
2.卸载函数
3.头文件
编写Makefile文件
obj-m := filename.o(若只由一个.c文件编译构成,无需下面一行)
filename-objs := file1.o file2.o file3.o(若由多个.c文件编译构成,则需加上这一行)
KDIR := /内核代码路径
all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux-ARCH=arm
clean:
rm -f *.o *.ko *.order *.symvers
KDIR:自定义的变量。这里表示内核路径
-C:进入路径
M:当前位置的路径
当安装模块之后,无法卸载,比如出现了如下问题,及解决办法。