Udev學習總結

Udev介紹


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
發佈了6 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章