驱动开发模板
#include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit // 模块安装函数 static int __init chrdev_init(void) { printk(KERN_INFO "chrdev_init\n"); //printk("<7>" "chrdev_init helloworld init\n"); //printk("<7> chrdev_init helloworld init\n"); return 0; } // 模块卸载函数 static void __exit chrdev_exit(void) { printk(KERN_INFO "chrdev_exit\n"); } module_init(chrdev_init); module_exit(chrdev_exit); // MODULE_xxx这种宏作用是用来添加模块描述信息 MODULE_LICENSE("GPL"); // 描述模块的许可证 MODULE_AUTHOR("cxtian"); // 描述模块的作者 MODULE_DESCRIPTION("module test"); // 描述模块的介绍信息 MODULE_ALIAS("alias xxx"); // 描述模块的别名信息
驱动编译的Makefile分析
#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个 KERN_VER = $(shell uname -r) KERN_DIR = /lib/modules/$(KERN_VER)/build # 开发板的linux内核的源码树目录 #KERN_DIR = /root/driver/kernel obj-m += module_test.o all: make -C $(KERN_DIR) M=`pwd` modules cp: cp *.ko /var/nfsboot/rootfs/driver_test .PHONY: clean clean: make -C $(KERN_DIR) M=`pwd` modules clean
(1)KERN_DIR,变量的值就是我们用来编译这个模块的内核源码树的目录
(2)obj-m += module_test.o,这一行就表示我们要将module_test.c文件编译成一个模块
(3)make -C $(KERN_DIR) M=`pwd` modules 这个命令用来实际编译模块,工作原理就是:利用make -C进入到我们指定的内核源码树目录下,然后在源码目录树下借用内核源码中定义的模块编译规则去编译这个模块,编译完成后把生成的文件还拷贝到当前目录下,完成编译。
(4)make clean ,用来清除编译痕迹