LINUX驱动模块示例讲解

驱动模块示例代码:
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