在Linux中想做驱动开发,那么一定要先熟悉module的使用和编写
一、什么是module
从名字上看就是模块的意思,我个人的理解就是一个一个的小程序,可以进行动态的安装和卸载,而在这里面就实现一些功能,其中驱动就是在module中。
二、编写一个最简单的module
编写一个最简单的module只需要两个文件即可:Makefile和xxx.c
(1)Makefile
1 #ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个 2 #KERN_VER = $(shell uname -r) 3 #KERN_DIR = /lib/modules/$(KERN_VER)/build 4 5 6 #开发板的linux内核的源码树目录 7 KERN_DIR = /root/3288_5.1/kernel 8 9 obj-m += module_test.o 10 11 all: 12 make -C $(KERN_DIR) M=`pwd` modules 13 14 .PHONY: clean 15 clean: 16 make -C $(KERN_DIR) M=`pwd` modules clean
在上面的Makefile中,最核心的一句就是make -C $(KERN_DIR) M=`pwd` modules
这句话的意思就是进入到kernel的源码目录中,使用内核源码中的编译规格来进行编译这个模块。
其目的主要是为了将module和kernel保持一致,在加载module时就不会出错。
(2)module_test.c
1 #include <linux/module.h> // module_init module_exit 2 #include <linux/init.h> // __init __exit 3 4 // 模块安装函数 5 static int __init chrdev_init(void) 6 { 7 printk(KERN_INFO "chrdev_init helloworld init\n"); 8 9 return 0; 10 } 11 12 // 模块卸载函数 13 static void __exit chrdev_exit(void) 14 { 15 printk(KERN_INFO "chrdev_exit helloworld exit\n"); 16 } 17 18 module_init(chrdev_init); 19 module_exit(chrdev_exit); 20 21 // MODULE_xxx这种宏作用是用来添加模块描述信息 22 MODULE_LICENSE("GPL"); // 描述模块的许可证 23 MODULE_AUTHOR("xuan"); // 描述模块的作者 24 MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息 25 MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
(3)编译和安装module
进入到代码的文件夹中,输入:make
然后,将生成的.ko文件放到平台中,输入:insmod xxx.ko