驅動模塊示例代碼:
https://gitee.com/yuewguo/linux_module_example.git
最簡單的內核模塊由1個c源文件和1個Makefile文件組成。
1、C源文件內容
1 #include <linux/init.h>
2 #include <linux/module.h>
3
4 MODULE_LICENSE("GPL");
5
6 static int UF_init(void)
7 {
8 printk(KERN_EMERG"install urlfilter succ!\r\n"); //與用戶態的printf功能相似
9 return 0;
10 }
11
12 static void UF_exit(void)
13 {
14 printk(KERN_EMERG"uninstall urlfilter succ!\r\n");
15 return ;
16 }
17
18 module_init(UF_init); // 指定模塊被裝載到內核時的調用函數
19 module_exit(UF_exit); // 指定模塊被從內核移除時的調用函數
2、Makefile內容
1 ifneq ($(KERNELRELEASE),)
2 obj-m :=xxx.o
3 xxx-objs = yyy.o zzz.o
4 else
5 KDIR ?= /lib/modules/$(shell uname -r)/build
6 PWD := $(shell pwd)
7
8 all:
9 make -C $(KDIR) M=$(PWD) modules
10 endif
解釋以下:
Makefile被執行兩次。
第一次由make命令觸發,由於KERNELRELEASE未被設置,綠色部分被執行。
-C選項指定內核源代碼目錄,M=選項指定在構造modules以前返回到模塊源代碼目錄
第二次由「M=」選項觸發,由於KERNELRELEASE此時已被設置,紫色部分被執行。
obj-m指定模塊名稱,好比上文指定的模塊名稱爲 xxx.ko
xxx-objs指定構建該模塊須要哪些目標文件
3、編譯、安裝、卸載
編譯 make
安裝模塊 insmod xxx.ko
卸載模塊 rmmod xxxlinux