1. 程式人生 > >linux 驅動程序 HelloWorld

linux 驅動程序 HelloWorld

形式 lin \n 語法 rmmod release lsmod con 程序

Linux驅動可以直接編譯進內核,也可以以模塊的形式進行加載,前者比較復雜,本文就以模塊的形式加載!

vi helloi_driver.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>


static int __init hello_init(void)
{
printk(KERN_ALERT "hello driver init!\n");
return 0;
}

static void __exit hello_exit(void)
{
printk(KERN_ALERT "hello driver exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

程序很簡單,沒有什麽說的。關鍵時驅動的Makefile文件。

ifneq ($(KERNELRELEASE),)

obj-m :=hello_driver.o

else

KERNELDIR ?=/lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

clean:
rm -rf *.o *~ .depend .* .

分析上述Makefile文件,KERNELRELEASE時內核源代碼頂層所定義的一個變量,當Makefile第一次執行時,這個變量並沒有定義,因此直接執行else中的內容,uname -r命令輸出當前系統所使用的版本號,/lib/modules/$(shell uname -r)/build這個就是Linux源碼所在的目錄,當執行到modules時,-C $(KERNELDIR) 指明跳轉到內核源碼目錄下讀取那裏的Makefile;M=$(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。

當從內核源碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名。

obj-m後面跟的就是最終的模塊名,hello_driver.o,make 會在該目錄下自動找到hello_driver.c文件進行編譯

hello_driver.o可能依賴多個文件或者模塊,那麽在obj-m後面就可以添加下面語句hello _driver-objs:=file.o file1.o

modules目標指向obj-m變量中設定的模塊。

最後通過insmod加載驅動模塊,用rmmod卸載模塊,此外還有兩個關於模塊的命令:lsmod modprob modinfo,lsmod用來列出所有的模塊,modprobe命令,可以智能插入模塊,它可以根據模塊間依存關系,以及/etc/modules.conf文件中的內容智能插入模塊。

上面加載模塊的例子在加載和卸載的過程中,就會有信息輸出,通過dmesg打印輸出。

linux 驅動程序 HelloWorld