linux 驱动程序 HelloWorld
?
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打印輸出。
轉載于:https://www.cnblogs.com/mingzhang/p/9094111.html
總結
以上是生活随笔為你收集整理的linux 驱动程序 HelloWorld的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python入门:常用模块—loggin
- 下一篇: 一文了解c/c++、java、JavaS