1. 程式人生 > >dev devfs udev sysfs及關系

dev devfs udev sysfs及關系

內核開發 one 什麽 不同 硬盤 區分 ble 加載 table

Linux 下對設備的管理方式主要有/dev和sysfs兩種,前者是將設備註冊為設備節點放入/dev目錄下,而後者是在linux2.6內核後引入的新的文件系統。 ?/dev方式 關於/dev的管理方式,也經歷了幾代,下面介紹/dev管理方式的發展: ?靜態/dev文件: 在Linux中,老的設備管理方式是將設備通過設備節點放入/dev目錄下,每個設備節點是/dev根目錄下的一個文件,那麽。如何區分這些設備節點,為了對這些設備節點進行命名,Linux通過主次設備號來指定不同的設備節點。 有了主次設備號,如何指定主次設備號成了一個開發人員必須面臨的問題。如果開發人員不打算將設備驅動程序與外界共享,那麽指定什麽號碼都可以,只要她與當前設備內核使用的其他主設備不沖突即可。然而,如果開發人員想讓驅動程序與外界共享(大多數Linux開發人員常常采用這一方法),那麽這樣隨意指定設備號進行了,因為用戶和其他開發人員並不知道哪個設備號對應於改設備,因此開發人員必須聯系linux內核開發人員分配一個真實主設備好,這樣在整個linux世界中,只有這個特定設備號才會被關聯到那個特定的設備號(即每一個設備對應一個唯一的設備號),而這個設備號也被匯入Linux的發行版本的/dev目錄中。 ?
基於這樣的處理方式,就會產生以下問題。 由於不斷湧入的新設備,設備號會慢慢耗盡。 這樣的申請分配方式對於設備的管理比較麻煩。 由於“正式”設備好不斷匯入/dev目錄。哪怕該設備在某些硬件上並不存在,這就導致很多設備號指向並存在的一些設備,在後期的/dev目錄下甚至有上萬個設備號。 ?Devfs linux kernel 2.4版本後引入devfs,devfs是一個虛擬的為念系統個,相比與靜態的/dev文件主要有兩點改進:
允許使用自定的設備名稱來註冊設備節點,同時它兼容老的設備號,例如我們註冊一個設備節點/dev/mydev 所有的設備都由內核在系統啟動時期創建並註冊到/dev目錄下,這就意味這/dev不在被成百個“無用”的設備節點充斥。 ?
Udev Devfs解決靜態/dev管理的很多問題,但是它任然存在一定缺陷,基於此,在linux kernel 2.6.x版本後,Linux引入了udev.從而對devfs進行改進。udev是一個對/dev下設備節點進行動態管理用戶空間程序她通過自身的守護進程自定義的一些列規則來處理設備的加載,移除和熱插拔等活動 相比與devfs ,它的主要改進如下: 傳統的devfs命名不夠靈活,設備名稱不可預知,而udev支持設備的固定命名。 例如如果現在有兩個硬盤,在devfs 中,他們們對應的設備節點分別是/dev/sda 和/dev/sdb ,那麽我麽就不知道硬盤對應於sda哪個又是sdb ,而udev 提供了存儲設備的固定命名,任何硬盤根據其唯一的文件系統id ,磁盤名稱及硬件鏈接的物理位置來進行識別。
設備在熱插拔的時候,用戶態程序應該有辦法得到通知。 udev 運行在用戶空間中,設備在熱插拔時候,會通過netlink(linux 中內核空間和用戶空間進程之間通信的方式)通知udev ,因此用戶空間程序可以得到通知了,同時Udev運行在用戶空間還可以減少內存的使用。 devfs代碼不靈活,只顯示存在的設備列表,而有時候我們希望看到暫時不存在的設備名字 major,minor 快被分配光了,我們需要考慮動態分配方法,而devfs不能支持。 而當設備較多的時候,不能動態分配節點給設備註冊造成很大的麻煩,需要不停嘗試不同的設備節點以檢查是否沖突。 ?sysfs sysfs是Linux2.6引入的一種虛擬文件系統,掛載於/sys目錄下,這個文件系統吧實際鏈接到系統上的設備,總線及其對應的驅動程序組織成分級的文件。從而將設備的層次結構映射到用戶空間中,用戶空間可以通過修改sysfs 中文件屬性來修改設備屬性值,從而與內核設備交互。 ?udev和sysfs 的關系 sysfs是對devfs改進,udev也是對devfs的改進。兩者之間的區別與聯系為:實際上用戶的工具udev就是利用sysfs提供的信息來實現的:udev會根據sysfs裏面的設備信息創建/dev目錄下的相應設備節點。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">



來自為知筆記(Wiz)



dev devfs udev sysfs及關系