dev devfs udev sysfs及關系
阿新 • • 發佈:2017-10-04
內核開發 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目錄下的相應設備節點。
●允許使用自定的設備名稱來註冊設備節點,同時它兼容老的設備號,例如我們註冊一個設備節點/dev/mydev ●所有的設備都由內核在系統啟動時期創建並註冊到/dev目錄下,這就意味這/dev不在被成百個“無用”的設備節點充斥。 ?
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
dev devfs udev sysfs及關系