mdev和udev

設備文件系統有devfs,mdev,udev

    mdev是udev的簡化版本,是busybox中所帶的程序,最適合用在嵌入式系統,而udev一般用在PC上的linux中,相對mdev來說要複雜些,devfs是2.4內核引入的,而在2.6內核中卻被udev所替代,他們有着共同的優點,只是devfs中存在一些未修復的BUG,作者也停止了對他的維護,最顯著的一個區別,採用devfs時,當一個並不存在的設備結點時,他卻還能自動的加載對應的設備驅動,而udev則不能,udev認爲當加載了不存在的對應的設備驅動的時候不應加載對應的驅動模塊,因爲加載也沒用,浪費了資源.
  從本質上來說,udev與mdev他們都是一個應用程序,配置了就可以使用,爲了方便使用,我們可以使用busybox自帶的mdev,當然也可以去下載udev的源碼去編譯和移植.


dev 和mdev 是兩個使用uevent 機制處理熱插拔問題的用戶空間程序,兩者的實現機理不同。udev 是基於netlink 機制的,它在系統啓動時運行了一個deamon 程序udevd,通過監聽內核發送的uevent 來執行相應的熱拔插動作,包括創建/刪除設備節點,加載/卸載驅動模塊等等。mdev 是基於uevent_helper 機制的,它在系統啓動時修改了內核中的uevnet_helper 變量(通過寫/proc/sys/kernel/hotplug),值爲“/sbin/mdev”。這樣內核產生uevent 時會調用uevent_helper 所指的用戶級程序,也就是mdev,來執行相應的熱拔插動作。udev 使用的netlink 機制在有大量uevent 的場合效率高,適合用在PC 機上;而mdev 使用的uevent_helper 機制實現簡單,適合用在嵌入式系統中。另外要說明的一點是,uevent_helper 的初始值在內核編譯時時可配置的,默認值爲/sbin/hotplug。如果想修改它的值,寫/proc/sys/kernel/hotplug 文件就可以了,例如:

echo “/sbin/mdev” > /proc/sys/kernel/hotplug

補充一點:如果使用的是udevd,那麼uevent_helper變量應爲空,即

echo “ ” > /proc/sys/kernel/hotplug


    簡單的將mdev看做udev的簡化版也就不準確了。這樣在做嵌入式的文件系統時就要注意了,一般只會使用mdev,目前我還不確定能不能只用udev,理論上是可以的,當然兩種一起用也是可以的,也就是mdev + udev,但是這時要注意了,寫規則時一定要注意,避免讓它們重複執行。也就是說udev執行過的,mdev不要再執行了。其實udev最大的特點就是使用了netlink,實質上是一個scoket,這個特別的scoket用來監測uevent,當然,我們也可以自己寫一個函數用來監測任何uevent事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章