---恢復內容開始---html
1:咱們以前的設備文件都是使用mknod命令來手動添加的,下面咱們要解決一下設備文件的自動添加問題:linux
設備文件的自動添加須要udev,busybox中的mdev是簡化版的udev;網絡
https://yq.aliyun.com/articles/10546ui
http://blog.chinaunix.net/uid-29401328-id-5019678.html.net
http://blog.csdn.net/michaelcao1980/article/details/39314615unix
http://blog.csdn.net/ce123_zhouwei/article/details/6690539htm
http://7071976.blog.51cto.com/7061976/1385965blog
http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077435.html開發
http://blog.csdn.net/skyflying2012/article/details/8295547編譯
什麼是mdev:
mdev是busybox自帶的一個簡化版的udev。
做用是在系統啓動和熱插拔 或動態加載驅動程序時,自動產生驅動程序所需的節點文件,在文件系統中的/dev目錄下的設備節點都是由mdev建立的
mdev掃描/sys/class和/sys/block中全部的類設備目錄,若是在目錄中含有名爲"dev"的文件,且文件中包含的是設備號,則mdev就利用這些信息爲這個設備在/dev下建立設備節點
動態更新不只是更新/dev目錄,還支持熱插拔,即支持接入卸下設備時執行某些動做,insmod自動建立/dev/***(class_create,class_device_create要自動建立設備必須依賴udev或mdev
mdov是根文件系統中的一個文件,屬於應用層,這個程序在咱們rcS文件中執行的設置mdev -S,讓它在系統啓動時建立全部的設備節點。
好比:咱們看一下開發板中:
/sys/class/i2c-dev目錄下:
在看一下/dev/目錄下的文件:
咱們掛在根文件系統後執行rcS文件,開啓了mdev,執行mdev -S命令,這個命令就會查找sys/class文件,根據下面的dev文件的主次設備號,來創建驅動設備文件,即在/dev/下創建i2c-0 i2c-1 i2c-2,這就是mdev的做用;
執行mdev -s命令時,mdev掃描/sys/block(塊設備保存在/sys/block目錄下,內核2.6.25版本之後,塊設備也保存在/sys /class/block目錄下。mdev掃描/sys/block是爲了實現向後兼容)和/sys/class兩個目錄下的dev屬性文件,從該dev 屬性文件中獲取到設備編號(dev屬性文件以"major:minor\n"形式保存設備編號),並以包含該dev屬性文件的目錄名稱做爲設備名 device_name(即包含dev屬性文件的目錄稱爲device_name,而/sys/class和device_name之間的那部分目錄稱爲 subsystem。也就是每一個dev屬性文件所在的路徑均可表示爲/sys/class/subsystem/device_name/dev),在 /dev目錄下建立相應的設備文件。例如,cat /sys/class/tty/tty0/dev會獲得4:0,subsystem爲tty,device_name爲tty0。
2:mdev的啓動方法:
用法:
1. 執行mdev前要掛載 /sys如下是代碼片斷: mount -t tmpfs mdev /dev mount -t sysfs sysfs /sys
2.命令內核在增刪設備時執行/sbin/mdev,使設備節點會被建立和刪除如下是代碼片斷:echo /sbin/mdev > /proc/sys/kernel/hotplug
3.設置mdev,讓它在系統啓動時建立全部的設備節點如下是代碼片斷:mdev -s
這些命令都是在rcS文件中設置好的,開機掛在根文件系統之後,執行linuxrc之後會自動執行rcS文件;
mdev工做實際是經過uevent文件來實現的。
uevent 是「user event」的簡稱,是一種內核向用戶空間發送信息的方式。Linux 內核的熱拔插機制(hotplug)就是經過uevent 實現的。
當在總線中註冊和刪除一個設備或一個設備驅動程序時,會調用kobject_uevent()產生uevent。kobject_uevent()的代碼在lib/kobject_uevent.c 中,
1.查找kobject 所屬的kset,並得到kset 的uevent_ops若是kobj->uevent_suppress 爲1,表示當前kobject 禁止產生uevent,返回0
2. 調用kset->uevent_ops->filter(),若是返回0,表示kset 禁止產生uevent,返回0
3.若是內核支持網絡功能,使用netlink Socket 向用戶空間廣播uevent
4.若是uevent_helper 有效,則調用它。
udev 和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
-------------------------------------------------------------------------------------、
未完待續繼續補充關於mdev、udev、uevent的內容
---恢復內容結束---