udev和驅動的自動載入

2021-10-22 17:35:17 字數 1558 閱讀 4899

在一般的驅動編寫時,我們可以通重載入模組來向系統新增裝置,也可以通過移除模組來刪除裝置。但是很多時候我們會設想到一種更加智慧型的的場景,即當裝置被新增到系統後,驅動可以自動載入,這對於實際的可支援熱插拔的硬體來說更有必要。比如說,我們插入乙個usb無線網絡卡,那麼對應的驅動就應該自動載入,而不是由使用者來手動載入。要想實現這一工能,我們就需要依賴乙個工具 — udev。在大多數嵌入式系統中通常使用mdev,其功能比udev要弱很多,同樣的我們也可以移植udev到嵌入式系統上。

先補充一點linux裝置模型的知識:使用了linux裝置模型後,任何裝置的新增、刪除或者狀態修改都會導致核心向使用者空間傳送相應的事件,這個事件叫uevent,它和kobject密切關聯。這樣使用者空間就可以鋪貨這些事件來自動完成某些操作,如自動載入驅動、自動建立和刪除裝置節點、修改許可權、建立軟連線修改網路裝置的名字等。目前實現這個功能的工具就是udev(或者mdev),這是乙個使用者空間的應用程式,捕獲來自核心空間發來的事件,然後根據其規則檔案進行操作。udev的規則檔案一般放在/etc/udev/rules.d目錄下的字尾為.rules的檔案。

udev規則檔案用# 來注釋,除此之外就是一條一條的規則。每條規則至少包含乙個鍵值對,建分為匹配和賦值兩種型別。如果核心發來的事件匹配了規則中的所有匹配鍵的值,那麼這條規則就可以得到應用,並且賦值建被賦予指定的值。一條規則包含了乙個或多個鍵值對,這些鍵值對用逗號隔開,每個鍵由操作符規定乙個操作,合法的操作符如下。

此外還有很多,這裡列出比較常見的。更加詳細的可以參考udev的man手冊。

值還可以使用?、*和來進行匹配,這和正規表示式中的含義是一樣的。

action==

"add"

, subsystem==

"scsi_device"

, run+

="/sbin/modprobe sg"

它表示當向scsi子系統新增任意裝置後都要新增乙個命令「/sbin/modprobe sg」到命令列表中,這個命令就是為相應的裝置載入sg驅動模組。

在ubuntu中自動載入驅動的規則如下,請將這條規則新增到/etc/udev/rules.d/40-modprobe.rules檔案中,如果沒有這個檔案請新建乙個。

env

=="?*"

,run+

="/sbin/modprobe $env"

它表示根據模組的別名資訊,用modprobe命令載入對應的核心模組。為此我們要給平台驅動乙個別名,如pltdrv.c檔案中**的第49行。pdev要和驅動中用於匹配平台裝置的名字保持一致。

$49

module_alias

("platform : pdev"

);

新增這一條規則後,載入pltdev模組就可以自動載入pltdev驅動。

驅動程式開機自動載入

將驅動程式編譯進核心的方法比較多,既可以進行靜態編譯,也可以動態載入。所以的靜態編譯,也就是在直接將驅動程式原始碼放入核心原始碼,在編譯核心原始碼時,就已經將驅動程式編譯進了核心。但是,我們也經常會遇到需要動態載入核心驅動。在編譯生成了驅動程式後,使用insmod命令載入即可,例如 insmod k...

linux 下開機自動載入驅動模組

呼呼,好久不見 前一段時間開發了乙個linux下的pci資料採集板卡的驅動,在驅動除錯時,一直使用insmod 動態的載入驅動模組 ko檔案 現在驅動基本開發結束,要提交給客戶,使用insmod載入時,對客戶來說不太好,比較麻煩,所以不能採用這種方法。由於 剛開始做驅動,還不知道如何在linux啟動...

Debian 9禁用驅動模組自動載入

1 建立乙個 etc modprobe.d blacklist.conf 格式為blacklist 驅動名稱 比如 blacklist wct4xxp 禁止開機時自動載入4e1數字卡驅動wct4xxp blacklist wct4xxp blacklist i2c algo bit blacklis...