熱插拔的工作原理 hotplug機制和udev

2021-06-09 04:17:59 字數 1751 閱讀 8739

裝置節點的建立,是通過sysfs介面分析dev文件取得裝置節點號,這個很顯而易見。那麼udevd是通過什麼機制來得知核心裡模組的變化情況,如何得知裝置的插入移除情況呢?當然是通過hotplug機制了,那 hotplug又是怎麼實現的?或說核心是如何通知使用者空間乙個事件的發生的呢?

答案是通過netlink socket通訊,在核心和使用者空間之間傳遞資訊。

核心呼叫kobject_uevent函式傳送netlink message給使用者空間,這部分工作通常無需驅動去自己處理,在統一裝置模型裡面,在子系統這一層面,已將這部分**處理好了,包括在裝置對應的特定的 kobject建立和移除的時候都會傳送相應add和remove訊息,當然前提是您在核心中配置了hotplug的支援。

netlink socket作為一種核心和使用者空間的通訊方式,不但僅用在hotplug機制中,同樣還應用在其他很多真正和網路相關的核心子系統中。

udevd通過標準的socket機制,建立socket連線來獲取核心廣播的uevent事件 並解析這些uevent事件

udevtrigger的工作機制

執行udevd以後,使用udevtrigger的時候,會把核心中已存在的裝置的節點建立出來,那麼他是怎麼做到這一點的? 分析udevtrigger的**能夠看出:

udevtrigger通過向/sysfs 文件系統下現有裝置的uevent節點寫"add"字串,從而觸發uevent事件,使得udevd能夠接收到這些事件,並建立buildin的裝置驅動的裝置節點連同任何已insmod的模組的裝置節點。

所以,我們也能夠手工用命令列來模擬這一過程:

/ # echo "add" > /sys/block/mtdblock2/uevent

/ # 

/ # uevent[178.415520] add      /block/mtdblock2 (block)

但是,進一步看**,您會發現,實際上,不管您往uevent裡面寫什麼,都會觸發add事件,這個從kernel內部對uevent屬性的實現函式能夠看出來,預設的實現是:

static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,

const char *buf, size_t count)

所以不管寫的內容是什麼,都是觸發add操作,真遺憾,我還想通過這個屬性實驗remove的操作。 不知道這樣限制的原因是什麼。

而udevstart的實現方式和udevtrigger就不同了,他基本上是重複實現了udevd裡面的機制,通過遍歷sysfs,自己完成裝置節點的建立,不通過udevd來完成。

udevd建立每乙個節點的時候,都會fork出乙個新的程序來單獨完成這個節點的建立工作。

uevent_seqnum 用來標識當前的uevent事件的序號(已產生了多少uevent事件),您能夠通過如下操作來檢視:

$ cat /sys/kernel/uevent_seqnum

2673

udev的工作原理 當系統核心發現安裝或者解除安裝了某乙個硬體裝置時,核心會執行hotplug,以便讓hotplug去安裝或解除安裝該硬體的驅動程式;hotplug在處理完硬體的驅動程式後,就會去呼叫執行udevd,以便讓udevd可以產生或者刪除硬體的裝置檔案。 接著udevd會通過libsysfs讀取sys檔案系統,以便取得該硬體裝置的資訊;然後再向namedev查詢該外部裝置的裝置檔案資訊,例如檔案的名稱、許可權等。最後,udevd就依據上述的結果,在/dev/目錄中自動建立該外部裝置的裝置檔案,同時在/etc/udev/rules.d下檢查有無針對該裝置的使用許可權

帶電插拔損壞裝置原理 那些裝置可以熱插拔?

我們常常會看到乙個詞語熱插拔,對於從事 it人事來講並不陌生,但對於一般普通使用者 來講熱插拔就一知半解了,那麼什麼是熱插拔呢,熱插拔是什麼意思呢,熱插拔就是指帶電 插拔電腦 it 上的裝置,英文 hot plugging 或hot swap 這樣就有很多人會理解成即插即 用,其實不然,這兩者是有本...

Linux USB口的熱插拔

目前要做乙個在嵌入式平台上的usb口的熱插拔事件。經過我現在的分析總結目前有如下方法 1,定時檢查 proc scsi scsi檔案 此方法只能在pc上,但在嵌入式平台上不可用。2,netlink方式 使用netlink.include include include include include...

Linux下的熱插拔檢測

這幾天在做linux的u盤檢測,僅限於熱插拔。查了很多資料,有用hal的,udisk的,還有直接用libusb庫的,最後無聊的我選擇了用netlinksock和udev來接收核心傳送過來的資訊,從而判斷有沒有裝置接入。include include include include intmain i...