在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