<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 設備文件系統devfs詳解

設備文件系統devfs詳解

作者: 時(shí)間:2010-06-01 來(lái)源:網(wǎng)絡(luò ) 收藏

介紹

設備,到處都是設備

本文引用地址:http://dyxdggzs.com/article/257953.htm

Devfs,也叫設備(Device Filesystem),設計它的唯一目的就是提供一個(gè)新的(更理性的)方式管理通常位于 /dev 的所有塊設備和字符設備。您也許知道,典型的 /dev 樹(shù)包含數百個(gè)塊特殊文件和字符特殊文件,它們全都在根上。每個(gè)特殊文件都可以讓用戶(hù)空間進(jìn)程輕松地與內核設備實(shí)現交互。舉例來(lái)說(shuō),通過(guò)對這些特殊文件執行操作,您的 X 服務(wù)器就能夠訪(fǎng)問(wèn)視頻硬件, fsck 可以執行檢驗, lpd 可以通過(guò)并行端口向打印機發(fā)送數據。

實(shí)際上,通常 Linux 和 Unix 更“酷”的方面是,設備不是簡(jiǎn)單地隱藏在晦澀的 API 之后,而是真正地與普通文件、目錄和符號鏈接一樣存在于文件系統上。因為字符和塊設備是映射到普通文件系統名稱(chēng)空間的,我們通??梢杂糜幸饬x的方式來(lái)與硬件交互,可以?xún)H使用標準 Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強的能力,并提高生產(chǎn)力。


設備管理問(wèn)題

然而,雖然本身是一件好事情,但典型的 Linux 系統以一種不太理想而且麻煩的方式管理這些特殊文件。 如今,Linux 支持 很多不同種類(lèi)的硬件。這意味著(zhù)嚴格意義上我們中絕大多數在 /dev 中都有數百個(gè)特殊文件來(lái)表示所有這些設備。還不止這樣,這些特殊文件中大多數甚至不會(huì )映射到系統中存在的設備上(但需要它們存在,只是考慮到我們最終會(huì )在系統中添加新的硬件/驅動(dòng)器),這讓事情變得更令人困惑。

僅從這個(gè)方面來(lái)看,我們就知道 /dev 需要徹底檢修,而創(chuàng )建 的明確目的就是讓 /dev 變回原形。為了很好地理解 是怎樣解決絕大多數 /dev 管理問(wèn)題的,我們從設備驅動(dòng)程序的角度來(lái)看看 devfs。


設備管理內幕


為了很好地理解 devfs ,最好是先理解從設備驅動(dòng)程序的角度來(lái)看 devfs 是怎樣改變事物的。傳統地(不使用 devfs),根據是否注冊在 塊設備或 字符設備,基于內核的設備驅動(dòng)程序通過(guò)調用 register_blkdev()或 register_chrdev() 向系統的其余部分注冊設備。

您必須提供一個(gè) 主設備號(一個(gè)無(wú)符號 8 位整數)作為 register_blkdev()或 register_chrdev() 的參數;然后,在設備注冊之后,內核就會(huì )知道這個(gè)特定的主設備號對應于執行 register_--?dev()調用的特定設備驅動(dòng)程序。

那么,設備驅動(dòng)程序開(kāi)發(fā)人員為調用 register_--?dev() 提供的主設備號 應該是什么呢?如果開(kāi)發(fā)人員不打算將設備驅動(dòng)程序與外界共享,那么什么號碼都可以,只要它與當前內核使用的其它主設備號都不沖突即可。開(kāi)發(fā)人員還可以選擇動(dòng)態(tài)地分配 register_--?dev() 調用的設備的主設備號。然而,這樣的解決方案通常只是在驅動(dòng)程序不會(huì )被其它人使用的情況下可行。


獲取號碼

然而,如果開(kāi)發(fā)人員想讓驅動(dòng)程序與外界共享(大多數 Linux 開(kāi)發(fā)人員常常采用這一方法),那么僅僅從“真空”中抽一個(gè)主設備號或者使用動(dòng)態(tài)的主設備號分配就不行了。相反,開(kāi)發(fā)人員必須聯(lián)系 Linux 內核開(kāi)發(fā)人員,這樣他(她)的特定的設備才能分配一個(gè)“正式”主設備號。那么,在整個(gè) Linux 世界中,這個(gè)特定的設備(也 只有這個(gè)設備)才會(huì )被關(guān)聯(lián)到那個(gè)特定的主設備號。

有一個(gè)“正式的”主設備號很重要,因為要與特定的設備交互,管理員必須在 /dev 創(chuàng )建一個(gè)特殊文件。當設備節點(diǎn)(特殊文件)創(chuàng )建后,它使用的主設備號必須同內核內部使用的完全相同。這樣,進(jìn)程對設備執行操作時(shí),內核就會(huì )知道應該引用什么設備驅動(dòng)程序。讓特殊文件到內核驅動(dòng)程序的映射成為可能的是主設備號,而不是真實(shí)的設備名稱(chēng)(它和非 devfs 系統無(wú)關(guān))。

一旦設備驅動(dòng)程序具備正式主設備號,設備就可以被公開(kāi)使用了,設備節點(diǎn)也就可以開(kāi)始并入不同分發(fā)版的 /dev 樹(shù),還有它們的正式 /dev/MAKEDEV 腳本(用來(lái)幫助超級用戶(hù)用正確的主從設備號、權限和所有權創(chuàng )建設備節點(diǎn)的特殊腳本)中。


傳統的問(wèn)題

不幸的是,這種方法有很多可伸縮性問(wèn)題。不僅設備驅動(dòng)程序開(kāi)發(fā)人員聯(lián)系內核開(kāi)發(fā)人員來(lái)獲取正式主設備號是一件討厭的事,內核開(kāi)發(fā)人員弄清他們怎樣分配所有這些主設備號甚至更加惱人。這種任務(wù)在很多方面很象系統管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 ― 這并不十分有趣。正如系統管理員可以利用 DHCP 來(lái)緩解這種管理負擔,如果設備注冊有某種類(lèi)似的方法就好了。

不只是這樣,Linux 還正在耗盡主設備號和副號碼。雖然這種問(wèn)題可以通過(guò)簡(jiǎn)單地擴展主設備號和副號碼使用的位數,首先維護這些主設備號映射就很討厭了,所以我們又在考慮有沒(méi)有更好的方法來(lái)處理這些事情。幸運的是,有這樣的方法;進(jìn)入 devfs。



進(jìn)入 devfs


devfs_register()

這里是對 devfs 如何一下子處理事情和解決這些問(wèn)題的一個(gè)簡(jiǎn)單明了的快速綱要。一旦 devfs 被正確配置(包括在內核添加 devfs 支持和對啟動(dòng)腳本進(jìn)行一些稍復雜的更改),超級用戶(hù)重新啟動(dòng)系統。然后內核開(kāi)始啟動(dòng),設備驅動(dòng)程序開(kāi)始向系統的剩余部分注冊設備。您會(huì )記起在非 devfs 系統上, register_blkdev()和 register_chrdev() 調用(連同提供的主設備號)正是用于這一目的。然而,現在啟用了 devfs,設備驅動(dòng)程序是用一種新的、改進(jìn)了的內核調用來(lái)注冊設備,稱(chēng)為 devfs_register()。

這里是 devfs_register() 調用有趣的地方。雖然為了兼容性目的指定主設備號和副號碼作為參數是可能的,但不再需要這樣了。相反, devfs_register()調用接受 設備路徑(就是它在 /dev 下可能的出現形式)作為參數。舉例來(lái)說(shuō),假設 foo 設備驅動(dòng)程序希望使用 devfs 注冊設備。它會(huì )提供一個(gè) foo0 的參數給 devfs_register(),從而告訴內核應該在 devfs 名稱(chēng)空間的根目錄創(chuàng )建一個(gè)新的 foo0 設備。相應的, devfs_register() 在 devfs 名稱(chēng)空間的根目錄添加 foo0設備節點(diǎn),并記錄這個(gè)新的 foo0 節點(diǎn)應該映射到內核中的 foo設備驅動(dòng)程序。


運行的 Devfs

一旦所有設備驅動(dòng)程序啟動(dòng)并向內核注冊適當的設備,內核就啟動(dòng) /sbin/init 和系統初始化腳本開(kāi)始執行。在啟動(dòng)過(guò)程初期(在文件系統檢查前),rc 腳本將 devfs 文件系統安裝在 /dev 中,/dev 包含了 devfs 名稱(chēng)空間的表達。這意味著(zhù)在安裝 /dev 后,所有注冊的設備(如上面的 /dev/foo0)都可以訪(fǎng)問(wèn),就象在非 devfs 上一樣。當它們被訪(fǎng)問(wèn)時(shí),內核 通過(guò) devfs 設備名稱(chēng)映射到合適的設備驅動(dòng)程序,而不是通過(guò)主設備號。

這種系統的優(yōu)點(diǎn)是,所有需要的設備節點(diǎn)(沒(méi)有別的了)都由內核自動(dòng)創(chuàng )建。這不僅僅意味著(zhù)不再需要 MAKEDEV(因為所有注冊的設備都只“出現”在 /dev 中),還意味著(zhù) /dev 不再被成百個(gè)“無(wú)用的”設備節點(diǎn)所充斥。實(shí)際上,使用 devfs,您可以只要查看 /dev 就知道系統上有什么設備。所以,如果您有一臺支持熱插拔的膝上型電腦,這意味著(zhù)您甚至可以在您從系統中插入和拔出 PC 卡時(shí)魔術(shù)般地讓設備從 /dev 中出現和消失。這讓 devfs 成為對以前笨拙局面的一個(gè)非常徹底和實(shí)用的解決方案。


devfs 的優(yōu)點(diǎn)

Devfs 讓很多事變得容易許多。請考慮一下創(chuàng )建一張 Linux 可引導光盤(pán)的問(wèn)題,它包括一個(gè)位于 CD 上的引導裝載器、一個(gè) initrd、一個(gè)內核和一個(gè)回送文件系統。當 CD 引導時(shí),引導裝載器裝載內核和 initrd,然后內核執行 initrd 上的 /linuxrc腳本。 /linuxrc 的主要任務(wù)是安裝 CD,從而使回送文件系統本身也可以被安裝和訪(fǎng)問(wèn)。

沒(méi)有 devfs, linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒(méi)有表示連接到系統的真實(shí)硬件。例如, linuxrc 會(huì )需要檢測 /dev/hdc、/dev/scd0、/dev/hdb 和其它的設備以檢測“活動(dòng)的”光盤(pán)驅動(dòng)器設備。在檢測進(jìn)程中,很可能命中幾個(gè)“無(wú)用的”設備節點(diǎn)。

然而,使用 devfs, linuxrc 只在 /dev/cdroms 中尋找,它包含了系統中所有和 活動(dòng)的光盤(pán)驅動(dòng)器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs 約定,再不需要猜測了;只有活動(dòng)的設備才會(huì )列出,而且設備檢測代碼甚至不必擔心底層的光盤(pán)驅動(dòng)器的細節,比如說(shuō)它使用什么 IDE 通道或者什么 SCSI ID。實(shí)際上,這是 devfs 的另一個(gè)主要好處;在我下一篇文章中,我們會(huì )看到 devfs 下 /dev 中的設備有全新的缺省位置。

實(shí)際上,如果您想訪(fǎng)問(wèn)一個(gè)特定的塊設備(如磁盤(pán)、分區、光盤(pán)驅動(dòng)器等等),事實(shí)上有 幾個(gè)不同的特殊文件可以引用。例如,我的服務(wù)器只有一個(gè) SCSI 光盤(pán)驅動(dòng)器;如果啟用了 devfs,我就可以通過(guò)安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪(fǎng)問(wèn)它。兩種都引用同一個(gè)設備,我可以引用我認為最方便的特殊文件。如果愿意,我還可以使用一種老式的設備名稱(chēng)(/dev/sr0)訪(fǎng)問(wèn)光盤(pán)驅動(dòng)器,這都是因為有一個(gè)非常便捷的叫 devfsd的小程序。 devfsd 是一個(gè)有功能很多的程序,它負責創(chuàng )建老式的“兼容性”特殊文件,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會(huì )詳細討論 devfsd,到時(shí)我會(huì )一直引導您啟動(dòng) devfs 并在您自己的系統上運行它。在那之前,請參考下面的參考資料以了解更多關(guān)于 devfs 的信息。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>