linux裝置驅動載入的Makefile學習

2021-06-11 20:32:31 字數 1542 閱讀 9266

因工作需要,現需要學習linux裝置驅動,從最簡單的字元裝置驅動開始,把自己的學習點滴記錄下來,

堅持自己

去思考和總結。

我為第乙個hello world字元驅動程式寫的makefile如下所示:

#kvers = $(shell uname -r)

ifneq ($(kernelrelease),)

obj-m += hello_world.o

else

kerdir =/usr/src/linux-headers-3.2.0-33-generic

#/lib/modules/3.2.0-33-generic/build

#/usr/src/linux-headers-3.2.0-33-generic

curdir =/home/wangyihong/my-drivers/first-driver/

default:

$(make)-c $(kerdir) m=$(curdir) modules

clean:

$(make)-c $(kerdir) m=$(curdir) clean

endif

其中,第一句ifneq ($(kernelrelease),)

表示如果kernelrelease已定義則執行下面的語句,如果沒有定義則執行else分支。顯然逗號後面為空,顯然,開始make的時候kernelrelease也為空,二者相等執行else分支語句

kerdir =/usr/src/linux-headers-3.2.0-33-generic

指定核心原始碼存放的目錄,其實

kerdir = /lib/modules/$(shelluname -r)/build

也可以找到,他們的內部結構是一樣的,$(shelluname -r)

表示執行shell命令uname -r輸出核心版本

curdir =/home/wangyihong/my-drivers/first-driver

是我編寫驅動源程式存放的路徑。

當make

的時候,首先執行else分支的default:$(make) -c $(kerdir) m=$(curdir)modules,$(make)表示make,-c $(kerdir) 表示到存放核心的目錄執行其makefile,在執行過程中會定義kernelrelease,然後m=$(curdir)表示返回到當前目錄,再次執行makefile,modules表示編譯成模組的意思。

而此時kernelrelease

已定義,則會執行obj-m += hello_world.o,表示會將hello_world.o目標編譯成.ko模組。若有多個原始檔,則採用如下方法:

obj-m := hello_world.o

hello_world-objs := file1.o file2.o file3.o

最後make clean

目標的時候,會將make生成的檔案全部給刪除掉。

以上是我學習為hello world

驅動模組載入編寫的乙個makefile的分析總結,若有錯誤之處,請指正,菜鳥啟動linxu裝置驅動之旅!

Linux 裝置和驅動載入的先後順序

linux驅動先註冊匯流排,匯流排上可以先掛 device 也可以先掛 driver 那麼究竟怎麼控制先後的順序呢。linux 系統使用兩種方式去載入系統中的模組 動態和靜態。靜態載入 將所有模組的程式編譯到 linux 核心中,由 do initcall 函式載入 核心程序 init main.c...

USB裝置驅動載入過程

本文摘自 使用者插入usb裝置 usb匯流排 或者是pci匯流排,這個不太清楚,反正就是匯流排來著 識別到插入了usb裝置。匯流排和usb裝置進行通訊,獲取usb的硬體id 產品id,以及bcdversion。根據這些資訊組成裝置硬體id號 vid x pid x rev x。匯流排根據usb裝置的...

Linux字元裝置驅動組成 載入,解除安裝day01

day01 摘要 linux裝置驅動原理,字元裝置載入解除安裝函式 最近在學習linux裝置驅動相關的知識.為了能夠系統的學習,把知識點總結一下,方便以後複習查證.1.原理 系統呼叫是作業系統核心和應用程式之間的介面 裝置驅動程式是作業系統核心和機器硬體之間的介面 裝置驅動程式為應用程式遮蔽了硬體的...