日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 驱动程序 HelloWorld

發布時間:2025/5/22 linux 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。