內核模塊的經典結構
#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:當前位置的路徑
當安裝模塊之後,無法卸載,比如出現瞭如下問題,及解決辦法。