Udev的下載網址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/
Udev分爲三個子計劃:namedev,libsysfs和udev。Namedev爲設備命名子系統,libsysfs提供訪問sysfs文件系統,從中獲取信息的標準接口。Udev是提供/dev設備節點文件的動態創建和刪除策略。
Namedev 使用5個步驟來決定指定設備的命名。
(1) 標籤/序列號
(2) 設備總線號
(3) 總線上的拓撲
(4) 替換名稱
(5) 內核提供的名稱
Udev的規則文件
Udev規則文件以行爲單位,以“#”開頭的代表註釋行,其餘的一行代表一個規則
規則分爲匹配和賦值兩部分。兩部分皆有自己的關鍵字。
匹配關鍵字:
ACTION,用於匹配行爲
KERNEL,匹配內核設備名
BUS,匹配總線
SYSFS,匹配從sysfs得到的信息,比如label,vendor,USB序列號。
SUBSYSTEM,匹配子系統名
賦值關鍵字
NAME,創建文件設備名
SYMLINK,符號鏈接名
OWNER,設置設備的所有者
GROUP,設置設備的組
IMPORT,調用外部程序
創建和配置udev
本人下載了udev-126,udev-100,udev-172, 使用udev-172無法編譯通過,udev-126不能得到試驗所說的9個工具程序,只有udevd,test-udev,udevadm三個工具程序。Udev-100可得到全部的9個程序
Udev-126的配置:./configure --prefix=/home/uncompress_software/udev-126/
--target=arm-linux --host=arm-vfp-linux-gnu LD=arm-vfp-linux-gnu-ld
make
make install
udev-100:修改了Makefile,其中包括CROSS_COMPILE,prefix兩個地方。
以下內容來自星光燦爛 'S bLog
由於在kernel啓動未完成以前我們的設備文件不可用,如果使用mtd設備作爲rootfs的掛載點,這個時候/dev/mtdblock
是不存在的,我們無法讓kernel找到rootfs,kernel只好停在那裏驚慌。 這個問題我們可以通過給kernel傳遞設備號的方式來解決,在linux系統中,mtdblock的主設備號是31,part號 從0開始,那麼以前的/dev/mtdblock/3就等同於31:03,以次類推,所以我們只需要修改bootloader傳給kernel 的cmd line參數,使root=31:03,就可以讓kernel在udevd未起來之前成功的找到rootfs。
在嵌入式系統中,只需要udevd和udevstart就能使udev正常工作。
將生成的udevd和udevstart複製到/sbin目錄,同時將udev源代碼目錄中etc/udev的文件複製到系統/etc目錄下。
最後編寫啓動,停止,重新啓動等工作的udev腳本。
Mdev介紹
以下內容來自mdev入門
mdev有兩個主要的應用:初始化對象和動態更新。兩個應用都需要內核sysfs的支持。爲了實現動態更新,你必須在內核配置時增加熱挺拔支持。
以下是系統初始化腳本中一個典型的使用mdev 的代碼片段:
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
簡單說明一下上面的代碼:
[1]你必須在執行mdev 前掛載 /sys 。
[2] 命令內核在增刪設備時執行 /bin/mdev ,使設備節點文件會被創建和刪除。
[3] 設置mdev,讓它在系統啓動時創建所有的設備節點。
當然,一個對mdev 更完整的安裝還必須在以上代碼片段前執行下面的命令:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts
[4]確保 /dev 是 tmpfs 文件系統(假設文件系統在 flash 外運行)。
[5] 創建/dev/pts 掛載點
[6] 在 /dev/pts 掛載 devpts 文件系統
例如:(來自smartarm3250)
#!/bin/sh
if [ ! -x /sbin/mdev ]
then
exit 0
fi
case "$1" in
start)
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
# put /dev in a tmpfs
mount -n -o mode=0755 -t tmpfs mdev /dev
# Create static device nodes in /dev
mknod /dev/console c 5 1
chmod 600 /dev/console
mknod /dev/null c 1 3
chmod 666 /dev/null
# make and mount devpts
mkdir /dev/pts
mount -n -t devpts devpts /dev/pts
echo "Starting the hotplug events dispatcher mdev"
/sbin/mdev -s
mkdir /dev/shm
;;
stop)
;;
*)
echo "Usage: /etc/rc.d/init.d/mdev {start|stop}"
echo
exit 1
;;
esac
exit 0
說明:以上內容就是mdev的啓動腳本,基本體現了上面的6個步驟。
Mount –n,掛載但不寫入
--blind,將一個子樹重新掛載到其它地方,使有多個地方可以見到些子樹
--move ,和blind有可比性,此項是移動子樹
Uevent,mdev,udev
如果你對linux設備模型瞭解的很清楚,那麼很自然就會想起驅動模型中的uevent。
以下內容來自張俊嶺《對Linux 設備驅動模型的一些理解》
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
補充一點:如果使用的是udevd,那麼uevent_helper變量應爲空,即
echo “ ” > /proc/sys/kernel/hotplug