udev學習筆記

2021-05-27 11:34:12 字數 2834 閱讀 2543

前言:

在採用udev對裝置的管理前採用devfs來完成,devfs 存在的主要的問題是它處理裝置檢測、建立和命名的方式,其中裝置節點的命名可能是最嚴重的問題。一般可接受的方式是,如果裝置名是可配置的,那麼裝置命名策略應該由系統管理員決定,而不是由某些開發者強制規定。devfs 檔案系統還存在競爭條件(race conditions)的問題,這是它天生的設計缺陷,不對核心做徹底的修改就無法修正這個問題。

devfs也有一下優點:

1.         可以通過程式在裝置初始化時在/dev目錄下建立裝置檔案,解除安裝時將它刪除。

2.         裝置驅動程式可以指定裝置號,所有者,和許可權位,使用者空間可以修改所有者和許可權位。

3.         不再需要為裝置驅動程式分配主裝置號以及處理的次裝置號,在程式可以直接

給register_chrdev()傳遞0主裝置號以動態獲得可用的主裝置號,並在devfs_register()

中指定次裝置號。

概念:udev是一種工具,它能夠根據系統中的硬體裝置的狀況動態更新裝置檔案,包括裝置檔案的建立,刪除等。裝置檔案通常放在/dev目錄下,使用udev 後,在/dev下面只包含系統中真實存在的裝置。它於硬體平台無關的,位於使用者空間,需要核心sysfs和tmpfs的支援,sysfs為udev提供裝置入口和uevent通道,tmpfs為udev裝置檔案提供存放空間。

udev基礎:硬體平台無關的,位於使用者空間,需要核心sysfs和tmpfs的支援,sysfs為udev提供裝置入口和uevent通道,tmpfs為udev裝置檔案提供存放空間。

udev機制:對於已經編入核心的驅動程式,當被核心檢測到的時候,會直接在 sysfs 中註冊其物件;對於編譯成模組的驅動程式,當模組載入的時候才會這樣做。一旦掛載了 sysfs 檔案系統(掛載到 /sys),內建的驅動程式在 sysfs 註冊的資料就可以被使用者空間的程序使用,並提供給 udev 以建立裝置節點。然後 udevstart 遍歷 /sys 檔案系統,並在 /dev 目錄下建立符合描述的裝置。例如,/sys/class/tty/vcs/dev 裡含有"7:0"字串,udevstart 就根據這個字串建立主裝置號為 7 、次裝置號為 0 的 /dev/vcs 裝置。udevstart 建立的每個裝置的名字和許可權由 /etc/udev/rules.d/ 目錄下的檔案指定的規則來設定。如果 udev 找不到所建立裝置的許可權檔案,就將其許可權設定為預設的 660 ,所有者為 root:root 。

udev熱插拔:udev 初始化指令碼負責在 linux 啟動的時候建立裝置節點,該指令碼首先將 /sbin/udevsend 註冊為熱插拔事件處理程式。當核心檢測到乙個新裝置連線時,核心會產生乙個熱插拔事件,並在 /proc/sys/kernel/hotplug 檔案裡查詢處理裝置連線的使用者空間程式。udev 初始化指令碼將 udevsend 註冊為該處理程式。當產生熱插拔事件的時候,核心讓 udev 在 /sys 檔案系統裡檢測與新裝置的有關資訊,並為新裝置在 /dev 裡建立專案。

udev裝置檔案的優點:

1.udev完全在使用者態工作,利用裝置加入或移除時核心所傳送的熱插拔事件。在熱插拔時,裝置的詳細資訊會由核心輸出到位於/sys的sysfs檔案系統。udev的裝置命名策略許可權控制都在使用者態完成的,它利用sysfs資訊來進行建立裝置檔案節點。2.udev根據系統中的硬體裝置的狀態動態更新裝置檔案,進行裝置檔案的建立和刪除等。注:使用udev,/dev目錄下就會只包含系統中真正存在的裝置。

注:所有在 sysfs 中顯示的裝置都可以由 udev 來建立節點。如果核心中增加了其它裝置的支援,udev 也就自動地可以為它們工作了。在init初始化之前,udev 可以被放入 initramfs 之中,並在每個裝置被發現的時候執行。也可以讓udev 工作在乙個真的根分割槽被載入之後根據 /sys 的內容建立的初始 /dev 目錄之中

在此之前的裝置檔案管理方法(靜態檔案和devfs)有幾個缺點:

*沒有足夠的主/輔裝置號。我們知道,每乙個裝置檔案是有兩個8位的數字:乙個是主裝置號 ,另外乙個是輔裝置號來分配的。這兩個8位的數字加上裝置型別(塊裝置或者字元裝置)來唯一標識乙個裝置。不幸的是,關聯這些身邊的的數字並不足夠。

*/dev目錄下檔案太多。乙個系統採用靜態裝置檔案關聯的方式,那麼這個目錄下的檔案必然是足夠多。而同時你又不知道在你的系統上到底有那些裝置檔案是啟用的。

*命名不夠靈活。儘管devfs解決了以前的一些問題,但是它自身又帶來了一些問題。其中乙個就是命名不夠靈活;你別想非常簡單的就能修改裝置檔案的名字。預設的devfs命令機制本身也很奇怪,他需要修改大量的配置檔案和程式。

*核心記憶體使用,devfs特有的另外乙個問題是,作為核心驅動模組,devfs需要消耗大量的記憶體,特別當系統上有大量的裝置時(比如上面我們提到的系統乙個上有好幾千磁碟時)udev的目標是想解決上面提到的這些問題,他通採用使用者空間(user-space)工具來管理/dev/目錄樹,他和檔案系統分開。知道如何改變預設配置能讓你如何定製自己的系統,比如建立裝置字元連線,改變裝置檔案屬組,許可權等。

使用uevent

在sysfs下的很多kobject下都有uevent屬性,它主要用於核心與udev (自動裝置發現程式)之間的乙個通訊介面;從udev本身與核心的通訊介面netlink協議套接字來說,它並不需要知道裝置的uevent屬性檔案,但多了uevent這樣乙個介面,可用於udevmonitor通過核心向udevd(udev後台程式)傳送訊息,也可用於檢查裝置本身所支援的netlink訊息上的環境變數,這個特性一般用於開發人員除錯udev規則檔案,udevtrigger這個除錯工具本身就是以寫各裝置的uevent屬性檔案實現的。

udev 規則學習

action add kernel sd a z 0 9 run bin umount l media usb k action add kernel sd a z 0 9 run bin rm fr media usb k action add kernel sd a z run bin umou...

udev實現原理

udev實現原理 作者 李先靜 相對於linux來說,udev還是乙個新事物。然而,儘管它03年才出現,儘管它很低調 j 但它無疑已經成為linux下不可或缺的元件了。udev是什麼?它是如何實現的?最近研究linux裝置管理時,花了一些時間去研究udev的實現。udev是什麼?u 是指user s...

udev 事件處理

處理 hotplug 傳統的方法是,在核心中執行乙個稱為 hotplug 的程式,相關引數通過環境變數傳遞過來,再由 hotplug 通知其它關注 hotplug 事件的應用程式。這樣做不但效率低下,而且感覺也不那麼優雅。新的方法是採用 netlink 實現的,這是一種特殊型別的 socket 專門...