資料介紹
設(shè)備,到處都是設(shè)備
Devfs,也叫設(shè)備文件系統(tǒng)(Device Filesystem),設(shè)計(jì)它的唯一目的就是提供一個(gè)新的(更理性的)方式管理通常位于 /dev 的所有塊設(shè)備和字符設(shè)備。您也許知道,典型的 /dev 樹包含數(shù)百個(gè)塊特殊文件和字符特殊文件,它們?nèi)荚诟募到y(tǒng)上。每個(gè)特殊文件都可以讓用戶空間進(jìn)程輕松地與內(nèi)核設(shè)備實(shí)現(xiàn)交互。舉例來(lái)說(shuō),通過(guò)對(duì)這些特殊文件執(zhí)行操作,您的 X 服務(wù)器就能夠訪問(wèn)視頻硬件, fsck 可以執(zhí)行文件系統(tǒng)檢驗(yàn), lpd 可以通過(guò)并行端口向打印機(jī)發(fā)送數(shù)據(jù)。
實(shí)際上,通常 Linux 和 Unix 更“酷”的方面是,設(shè)備不是簡(jiǎn)單地隱藏在晦澀的 API 之后,而是真正地與普通文件、目錄和符號(hào)鏈接一樣存在于文件系統(tǒng)上。因?yàn)樽址蛪K設(shè)備是映射到普通文件系統(tǒng)名稱空間的,我們通??梢杂糜幸饬x的方式來(lái)與硬件交互,可以僅使用標(biāo)準(zhǔn) Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強(qiáng)的能力,并提高生產(chǎn)力。
設(shè)備管理問(wèn)題
然而,雖然設(shè)備特殊文件本身是一件好事情,但典型的 Linux 系統(tǒng)以一種不太理想而且麻煩的方式管理這些特殊文件。 如今,Linux 支持 很多不同種類的硬件。這意味著嚴(yán)格意義上我們中絕大多數(shù)在 /dev 中都有數(shù)百個(gè)特殊文件來(lái)表示所有這些設(shè)備。還不止這樣,這些特殊文件中大多數(shù)甚至不會(huì)映射到系統(tǒng)中存在的設(shè)備上(但需要它們存在,只是考慮到我們最終會(huì)在系統(tǒng)中添加新的硬件/驅(qū)動(dòng)器),這讓事情變得更令人困惑。
僅從這個(gè)方面來(lái)看,我們就知道 /dev 需要徹底檢修,而創(chuàng)建 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數(shù) /dev 管理問(wèn)題的,我們從設(shè)備驅(qū)動(dòng)程序的角度來(lái)看看 devfs。
設(shè)備管理內(nèi)幕
為了很好地理解 devfs ,最好是先理解從設(shè)備驅(qū)動(dòng)程序的角度來(lái)看 devfs 是怎樣改變事物的。傳統(tǒng)地(不使用 devfs),根據(jù)是否注冊(cè)在 塊設(shè)備或 字符設(shè)備,基于內(nèi)核的設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用 register_blkdev()或 register_chrdev() 向系統(tǒng)的其余部分注冊(cè)設(shè)備。
您必須提供一個(gè) 主設(shè)備號(hào)(一個(gè)無(wú)符號(hào) 8 位整數(shù))作為 register_blkdev()或 register_chrdev() 的參數(shù);然后,在設(shè)備注冊(cè)之后,內(nèi)核就會(huì)知道這個(gè)特定的主設(shè)備號(hào)對(duì)應(yīng)于執(zhí)行 register_--?dev()調(diào)用的特定設(shè)備驅(qū)動(dòng)程序。
那么,設(shè)備驅(qū)動(dòng)程序開發(fā)人員為調(diào)用 register_--?dev() 提供的主設(shè)備號(hào) 應(yīng)該是什么呢?如果開發(fā)人員不打算將設(shè)備驅(qū)動(dòng)程序與外界共享,那么什么號(hào)碼都可以,只要它與當(dāng)前內(nèi)核使用的其它主設(shè)備號(hào)都不沖突即可。開發(fā)人員還可以選擇動(dòng)態(tài)地分配 register_--?dev() 調(diào)用的設(shè)備的主設(shè)備號(hào)。然而,這樣的解決方案通常只是在驅(qū)動(dòng)程序不會(huì)被其它人使用的情況下可行。
獲取號(hào)碼
然而,如果開發(fā)人員想讓驅(qū)動(dòng)程序與外界共享(大多數(shù) Linux 開發(fā)人員常常采用這一方法),那么僅僅從“真空”中抽一個(gè)主設(shè)備號(hào)或者使用動(dòng)態(tài)的主設(shè)備號(hào)分配就不行了。相反,開發(fā)人員必須聯(lián)系 Linux 內(nèi)核開發(fā)人員,這樣他(她)的特定的設(shè)備才能分配一個(gè)“正式”主設(shè)備號(hào)。那么,在整個(gè) Linux 世界中,這個(gè)特定的設(shè)備(也 只有這個(gè)設(shè)備)才會(huì)被關(guān)聯(lián)到那個(gè)特定的主設(shè)備號(hào)。
有一個(gè)“正式的”主設(shè)備號(hào)很重要,因?yàn)橐c特定的設(shè)備交互,管理員必須在 /dev 創(chuàng)建一個(gè)特殊文件。當(dāng)設(shè)備節(jié)點(diǎn)(特殊文件)創(chuàng)建后,它使用的主設(shè)備號(hào)必須同內(nèi)核內(nèi)部使用的完全相同。這樣,進(jìn)程對(duì)設(shè)備執(zhí)行操作時(shí),內(nèi)核就會(huì)知道應(yīng)該引用什么設(shè)備驅(qū)動(dòng)程序。讓特殊文件到內(nèi)核驅(qū)動(dòng)程序的映射成為可能的是主設(shè)備號(hào),而不是真實(shí)的設(shè)備名稱(它和非 devfs 系統(tǒng)無(wú)關(guān))。
一旦設(shè)備驅(qū)動(dòng)程序具備正式主設(shè)備號(hào),設(shè)備就可以被公開使用了,設(shè)備節(jié)點(diǎn)也就可以開始并入不同分發(fā)版的 /dev 樹,還有它們的正式 /dev/MAKEDEV 腳本(用來(lái)幫助超級(jí)用戶用正確的主從設(shè)備號(hào)、權(quán)限和所有權(quán)創(chuàng)建設(shè)備節(jié)點(diǎn)的特殊腳本)中。
傳統(tǒng)的問(wèn)題
不幸的是,這種方法有很多可伸縮性問(wèn)題。不僅設(shè)備驅(qū)動(dòng)程序開發(fā)人員聯(lián)系內(nèi)核開發(fā)人員來(lái)獲取正式主設(shè)備號(hào)是一件討厭的事,內(nèi)核開發(fā)人員弄清他們?cè)鯓臃峙渌羞@些主設(shè)備號(hào)甚至更加惱人。這種任務(wù)在很多方面很象系統(tǒng)管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 ― 這并不十分有趣。正如系統(tǒng)管理員可以利用 DHCP 來(lái)緩解這種管理負(fù)擔(dān),如果設(shè)備注冊(cè)有某種類似的方法就好了。
不只是這樣,Linux 還正在耗盡主設(shè)備號(hào)和副號(hào)碼。雖然這種問(wèn)題可以通過(guò)簡(jiǎn)單地?cái)U(kuò)展主設(shè)備號(hào)和副號(hào)碼使用的位數(shù),首先維護(hù)這些主設(shè)備號(hào)映射就很討厭了,所以我們又在考慮有沒(méi)有更好的方法來(lái)處理這些事情。幸運(yùn)的是,有這樣的方法;進(jìn)入 devfs。
進(jìn)入 devfs
devfs_register()
這里是對(duì) devfs 如何一下子處理事情和解決這些問(wèn)題的一個(gè)簡(jiǎn)單明了的快速綱要。一旦 devfs 被正確配置(包括在內(nèi)核添加 devfs 支持和對(duì)啟動(dòng)腳本進(jìn)行一些稍復(fù)雜的更改),超級(jí)用戶重新啟動(dòng)系統(tǒng)。然后內(nèi)核開始啟動(dòng),設(shè)備驅(qū)動(dòng)程序開始向系統(tǒng)的剩余部分注冊(cè)設(shè)備。您會(huì)記起在非 devfs 系統(tǒng)上, register_blkdev()和 register_chrdev() 調(diào)用(連同提供的主設(shè)備號(hào))正是用于這一目的。然而,現(xiàn)在啟用了 devfs,設(shè)備驅(qū)動(dòng)程序是用一種新的、改進(jìn)了的內(nèi)核調(diào)用來(lái)注冊(cè)設(shè)備,稱為 devfs_register()。
這里是 devfs_register() 調(diào)用有趣的地方。雖然為了兼容性目的指定主設(shè)備號(hào)和副號(hào)碼作為參數(shù)是可能的,但不再需要這樣了。相反, devfs_register()調(diào)用接受 設(shè)備路徑(就是它在 /dev 下可能的出現(xiàn)形式)作為參數(shù)。舉例來(lái)說(shuō),假設(shè) foo 設(shè)備驅(qū)動(dòng)程序希望使用 devfs 注冊(cè)設(shè)備。它會(huì)提供一個(gè) foo0 的參數(shù)給 devfs_register(),從而告訴內(nèi)核應(yīng)該在 devfs 名稱空間的根目錄創(chuàng)建一個(gè)新的 foo0 設(shè)備。相應(yīng)的, devfs_register() 在 devfs 名稱空間的根目錄添加 foo0設(shè)備節(jié)點(diǎn),并記錄這個(gè)新的 foo0 節(jié)點(diǎn)應(yīng)該映射到內(nèi)核中的 foo設(shè)備驅(qū)動(dòng)程序。
運(yùn)行的 Devfs
一旦所有設(shè)備驅(qū)動(dòng)程序啟動(dòng)并向內(nèi)核注冊(cè)適當(dāng)?shù)脑O(shè)備,內(nèi)核就啟動(dòng) /sbin/init 和系統(tǒng)初始化腳本開始執(zhí)行。在啟動(dòng)過(guò)程初期(在文件系統(tǒng)檢查前),rc 腳本將 devfs 文件系統(tǒng)安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達(dá)。這意味著在安裝 /dev 后,所有注冊(cè)的設(shè)備(如上面的 /dev/foo0)都可以訪問(wèn),就象在非 devfs 上一樣。當(dāng)它們被訪問(wèn)時(shí),內(nèi)核 通過(guò) devfs 設(shè)備名稱映射到合適的設(shè)備驅(qū)動(dòng)程序,而不是通過(guò)主設(shè)備號(hào)。
這種系統(tǒng)的優(yōu)點(diǎn)是,所有需要的設(shè)備節(jié)點(diǎn)(沒(méi)有別的了)都由內(nèi)核自動(dòng)創(chuàng)建。這不僅僅意味著不再需要 MAKEDEV(因?yàn)樗凶?cè)的設(shè)備都只“出現(xiàn)”在 /dev 中),還意味著 /dev 不再被成百個(gè)“無(wú)用的”設(shè)備節(jié)點(diǎn)所充斥。實(shí)際上,使用 devfs,您可以只要查看 /dev 就知道系統(tǒng)上有什么設(shè)備。所以,如果您有一臺(tái)支持熱插拔的膝上型電腦,這意味著您甚至可以在您從系統(tǒng)中插入和拔出 PC 卡時(shí)魔術(shù)般地讓設(shè)備從 /dev 中出現(xiàn)和消失。這讓 devfs 成為對(duì)以前笨拙局面的一個(gè)非常徹底和實(shí)用的解決方案。
devfs 的優(yōu)點(diǎn)
Devfs 讓很多事變得容易許多。請(qǐng)考慮一下創(chuàng)建一張 Linux 可引導(dǎo)光盤的問(wèn)題,它包括一個(gè)位于 CD 上的引導(dǎo)裝載器、一個(gè) initrd、一個(gè)內(nèi)核和一個(gè)回送文件系統(tǒng)。當(dāng) CD 引導(dǎo)時(shí),引導(dǎo)裝載器裝載內(nèi)核和 initrd,然后內(nèi)核執(zhí)行 initrd 上的 /linuxrc腳本。 /linuxrc 的主要任務(wù)是安裝 CD,從而使回送文件系統(tǒng)本身也可以被安裝和訪問(wèn)。
沒(méi)有 devfs, linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒(méi)有表示連接到系統(tǒng)的真實(shí)硬件。例如, linuxrc 會(huì)需要檢測(cè) /dev/hdc、/dev/scd0、/dev/hdb 和其它的設(shè)備以檢測(cè)“活動(dòng)的”光盤驅(qū)動(dòng)器設(shè)備。在檢測(cè)進(jìn)程中,很可能命中幾個(gè)“無(wú)用的”設(shè)備節(jié)點(diǎn)。
然而,使用 devfs, linuxrc 只在 /dev/cdroms 中尋找,它包含了系統(tǒng)中所有和 活動(dòng)的光盤驅(qū)動(dòng)器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs 約定,再不需要猜測(cè)了;只有活動(dòng)的設(shè)備才會(huì)列出,而且設(shè)備檢測(cè)代碼甚至不必?fù)?dān)心底層的光盤驅(qū)動(dòng)器的細(xì)節(jié),比如說(shuō)它使用什么 IDE 通道或者什么 SCSI ID。實(shí)際上,這是 devfs 的另一個(gè)主要好處;在我下一篇文章中,我們會(huì)看到 devfs 下 /dev 中的設(shè)備有全新的缺省位置。
實(shí)際上,如果您想訪問(wèn)一個(gè)特定的塊設(shè)備(如磁盤、分區(qū)、光盤驅(qū)動(dòng)器等等),事實(shí)上有 幾個(gè)不同的特殊文件可以引用。例如,我的服務(wù)器只有一個(gè) SCSI 光盤驅(qū)動(dòng)器;如果啟用了 devfs,我就可以通過(guò)安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪問(wèn)它。兩種都引用同一個(gè)設(shè)備,我可以引用我認(rèn)為最方便的特殊文件。如果愿意,我還可以使用一種老式的設(shè)備名稱(/dev/sr0)訪問(wèn)光盤驅(qū)動(dòng)器,這都是因?yàn)橛幸粋€(gè)非常便捷的叫 devfsd的小程序。 devfsd 是一個(gè)有功能很多的程序,它負(fù)責(zé)創(chuàng)建老式的“兼容性”特殊文件,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會(huì)詳細(xì)討論 devfsd,到時(shí)我會(huì)一直引導(dǎo)您啟動(dòng) devfs 并在您自己的系統(tǒng)上運(yùn)行它。在那之前,請(qǐng)參考下面的參考資料以了解更多關(guān)于 devfs 的信息。
?
Devfs,也叫設(shè)備文件系統(tǒng)(Device Filesystem),設(shè)計(jì)它的唯一目的就是提供一個(gè)新的(更理性的)方式管理通常位于 /dev 的所有塊設(shè)備和字符設(shè)備。您也許知道,典型的 /dev 樹包含數(shù)百個(gè)塊特殊文件和字符特殊文件,它們?nèi)荚诟募到y(tǒng)上。每個(gè)特殊文件都可以讓用戶空間進(jìn)程輕松地與內(nèi)核設(shè)備實(shí)現(xiàn)交互。舉例來(lái)說(shuō),通過(guò)對(duì)這些特殊文件執(zhí)行操作,您的 X 服務(wù)器就能夠訪問(wèn)視頻硬件, fsck 可以執(zhí)行文件系統(tǒng)檢驗(yàn), lpd 可以通過(guò)并行端口向打印機(jī)發(fā)送數(shù)據(jù)。
實(shí)際上,通常 Linux 和 Unix 更“酷”的方面是,設(shè)備不是簡(jiǎn)單地隱藏在晦澀的 API 之后,而是真正地與普通文件、目錄和符號(hào)鏈接一樣存在于文件系統(tǒng)上。因?yàn)樽址蛪K設(shè)備是映射到普通文件系統(tǒng)名稱空間的,我們通??梢杂糜幸饬x的方式來(lái)與硬件交互,可以僅使用標(biāo)準(zhǔn) Unix 命令,如 cat 和 dd。除了有趣之外,這還使我們有更強(qiáng)的能力,并提高生產(chǎn)力。
設(shè)備管理問(wèn)題
然而,雖然設(shè)備特殊文件本身是一件好事情,但典型的 Linux 系統(tǒng)以一種不太理想而且麻煩的方式管理這些特殊文件。 如今,Linux 支持 很多不同種類的硬件。這意味著嚴(yán)格意義上我們中絕大多數(shù)在 /dev 中都有數(shù)百個(gè)特殊文件來(lái)表示所有這些設(shè)備。還不止這樣,這些特殊文件中大多數(shù)甚至不會(huì)映射到系統(tǒng)中存在的設(shè)備上(但需要它們存在,只是考慮到我們最終會(huì)在系統(tǒng)中添加新的硬件/驅(qū)動(dòng)器),這讓事情變得更令人困惑。
僅從這個(gè)方面來(lái)看,我們就知道 /dev 需要徹底檢修,而創(chuàng)建 devfs 的明確目的就是讓 /dev 變回原形。為了很好地理解 devfs 是怎樣解決絕大多數(shù) /dev 管理問(wèn)題的,我們從設(shè)備驅(qū)動(dòng)程序的角度來(lái)看看 devfs。
設(shè)備管理內(nèi)幕
為了很好地理解 devfs ,最好是先理解從設(shè)備驅(qū)動(dòng)程序的角度來(lái)看 devfs 是怎樣改變事物的。傳統(tǒng)地(不使用 devfs),根據(jù)是否注冊(cè)在 塊設(shè)備或 字符設(shè)備,基于內(nèi)核的設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用 register_blkdev()或 register_chrdev() 向系統(tǒng)的其余部分注冊(cè)設(shè)備。
您必須提供一個(gè) 主設(shè)備號(hào)(一個(gè)無(wú)符號(hào) 8 位整數(shù))作為 register_blkdev()或 register_chrdev() 的參數(shù);然后,在設(shè)備注冊(cè)之后,內(nèi)核就會(huì)知道這個(gè)特定的主設(shè)備號(hào)對(duì)應(yīng)于執(zhí)行 register_--?dev()調(diào)用的特定設(shè)備驅(qū)動(dòng)程序。
那么,設(shè)備驅(qū)動(dòng)程序開發(fā)人員為調(diào)用 register_--?dev() 提供的主設(shè)備號(hào) 應(yīng)該是什么呢?如果開發(fā)人員不打算將設(shè)備驅(qū)動(dòng)程序與外界共享,那么什么號(hào)碼都可以,只要它與當(dāng)前內(nèi)核使用的其它主設(shè)備號(hào)都不沖突即可。開發(fā)人員還可以選擇動(dòng)態(tài)地分配 register_--?dev() 調(diào)用的設(shè)備的主設(shè)備號(hào)。然而,這樣的解決方案通常只是在驅(qū)動(dòng)程序不會(huì)被其它人使用的情況下可行。
獲取號(hào)碼
然而,如果開發(fā)人員想讓驅(qū)動(dòng)程序與外界共享(大多數(shù) Linux 開發(fā)人員常常采用這一方法),那么僅僅從“真空”中抽一個(gè)主設(shè)備號(hào)或者使用動(dòng)態(tài)的主設(shè)備號(hào)分配就不行了。相反,開發(fā)人員必須聯(lián)系 Linux 內(nèi)核開發(fā)人員,這樣他(她)的特定的設(shè)備才能分配一個(gè)“正式”主設(shè)備號(hào)。那么,在整個(gè) Linux 世界中,這個(gè)特定的設(shè)備(也 只有這個(gè)設(shè)備)才會(huì)被關(guān)聯(lián)到那個(gè)特定的主設(shè)備號(hào)。
有一個(gè)“正式的”主設(shè)備號(hào)很重要,因?yàn)橐c特定的設(shè)備交互,管理員必須在 /dev 創(chuàng)建一個(gè)特殊文件。當(dāng)設(shè)備節(jié)點(diǎn)(特殊文件)創(chuàng)建后,它使用的主設(shè)備號(hào)必須同內(nèi)核內(nèi)部使用的完全相同。這樣,進(jìn)程對(duì)設(shè)備執(zhí)行操作時(shí),內(nèi)核就會(huì)知道應(yīng)該引用什么設(shè)備驅(qū)動(dòng)程序。讓特殊文件到內(nèi)核驅(qū)動(dòng)程序的映射成為可能的是主設(shè)備號(hào),而不是真實(shí)的設(shè)備名稱(它和非 devfs 系統(tǒng)無(wú)關(guān))。
一旦設(shè)備驅(qū)動(dòng)程序具備正式主設(shè)備號(hào),設(shè)備就可以被公開使用了,設(shè)備節(jié)點(diǎn)也就可以開始并入不同分發(fā)版的 /dev 樹,還有它們的正式 /dev/MAKEDEV 腳本(用來(lái)幫助超級(jí)用戶用正確的主從設(shè)備號(hào)、權(quán)限和所有權(quán)創(chuàng)建設(shè)備節(jié)點(diǎn)的特殊腳本)中。
傳統(tǒng)的問(wèn)題
不幸的是,這種方法有很多可伸縮性問(wèn)題。不僅設(shè)備驅(qū)動(dòng)程序開發(fā)人員聯(lián)系內(nèi)核開發(fā)人員來(lái)獲取正式主設(shè)備號(hào)是一件討厭的事,內(nèi)核開發(fā)人員弄清他們?cè)鯓臃峙渌羞@些主設(shè)備號(hào)甚至更加惱人。這種任務(wù)在很多方面很象系統(tǒng)管理員跟蹤公司局域網(wǎng)靜態(tài) IP 地址分配的工作 ― 這并不十分有趣。正如系統(tǒng)管理員可以利用 DHCP 來(lái)緩解這種管理負(fù)擔(dān),如果設(shè)備注冊(cè)有某種類似的方法就好了。
不只是這樣,Linux 還正在耗盡主設(shè)備號(hào)和副號(hào)碼。雖然這種問(wèn)題可以通過(guò)簡(jiǎn)單地?cái)U(kuò)展主設(shè)備號(hào)和副號(hào)碼使用的位數(shù),首先維護(hù)這些主設(shè)備號(hào)映射就很討厭了,所以我們又在考慮有沒(méi)有更好的方法來(lái)處理這些事情。幸運(yùn)的是,有這樣的方法;進(jìn)入 devfs。
進(jìn)入 devfs
devfs_register()
這里是對(duì) devfs 如何一下子處理事情和解決這些問(wèn)題的一個(gè)簡(jiǎn)單明了的快速綱要。一旦 devfs 被正確配置(包括在內(nèi)核添加 devfs 支持和對(duì)啟動(dòng)腳本進(jìn)行一些稍復(fù)雜的更改),超級(jí)用戶重新啟動(dòng)系統(tǒng)。然后內(nèi)核開始啟動(dòng),設(shè)備驅(qū)動(dòng)程序開始向系統(tǒng)的剩余部分注冊(cè)設(shè)備。您會(huì)記起在非 devfs 系統(tǒng)上, register_blkdev()和 register_chrdev() 調(diào)用(連同提供的主設(shè)備號(hào))正是用于這一目的。然而,現(xiàn)在啟用了 devfs,設(shè)備驅(qū)動(dòng)程序是用一種新的、改進(jìn)了的內(nèi)核調(diào)用來(lái)注冊(cè)設(shè)備,稱為 devfs_register()。
這里是 devfs_register() 調(diào)用有趣的地方。雖然為了兼容性目的指定主設(shè)備號(hào)和副號(hào)碼作為參數(shù)是可能的,但不再需要這樣了。相反, devfs_register()調(diào)用接受 設(shè)備路徑(就是它在 /dev 下可能的出現(xiàn)形式)作為參數(shù)。舉例來(lái)說(shuō),假設(shè) foo 設(shè)備驅(qū)動(dòng)程序希望使用 devfs 注冊(cè)設(shè)備。它會(huì)提供一個(gè) foo0 的參數(shù)給 devfs_register(),從而告訴內(nèi)核應(yīng)該在 devfs 名稱空間的根目錄創(chuàng)建一個(gè)新的 foo0 設(shè)備。相應(yīng)的, devfs_register() 在 devfs 名稱空間的根目錄添加 foo0設(shè)備節(jié)點(diǎn),并記錄這個(gè)新的 foo0 節(jié)點(diǎn)應(yīng)該映射到內(nèi)核中的 foo設(shè)備驅(qū)動(dòng)程序。
運(yùn)行的 Devfs
一旦所有設(shè)備驅(qū)動(dòng)程序啟動(dòng)并向內(nèi)核注冊(cè)適當(dāng)?shù)脑O(shè)備,內(nèi)核就啟動(dòng) /sbin/init 和系統(tǒng)初始化腳本開始執(zhí)行。在啟動(dòng)過(guò)程初期(在文件系統(tǒng)檢查前),rc 腳本將 devfs 文件系統(tǒng)安裝在 /dev 中,/dev 包含了 devfs 名稱空間的表達(dá)。這意味著在安裝 /dev 后,所有注冊(cè)的設(shè)備(如上面的 /dev/foo0)都可以訪問(wèn),就象在非 devfs 上一樣。當(dāng)它們被訪問(wèn)時(shí),內(nèi)核 通過(guò) devfs 設(shè)備名稱映射到合適的設(shè)備驅(qū)動(dòng)程序,而不是通過(guò)主設(shè)備號(hào)。
這種系統(tǒng)的優(yōu)點(diǎn)是,所有需要的設(shè)備節(jié)點(diǎn)(沒(méi)有別的了)都由內(nèi)核自動(dòng)創(chuàng)建。這不僅僅意味著不再需要 MAKEDEV(因?yàn)樗凶?cè)的設(shè)備都只“出現(xiàn)”在 /dev 中),還意味著 /dev 不再被成百個(gè)“無(wú)用的”設(shè)備節(jié)點(diǎn)所充斥。實(shí)際上,使用 devfs,您可以只要查看 /dev 就知道系統(tǒng)上有什么設(shè)備。所以,如果您有一臺(tái)支持熱插拔的膝上型電腦,這意味著您甚至可以在您從系統(tǒng)中插入和拔出 PC 卡時(shí)魔術(shù)般地讓設(shè)備從 /dev 中出現(xiàn)和消失。這讓 devfs 成為對(duì)以前笨拙局面的一個(gè)非常徹底和實(shí)用的解決方案。
devfs 的優(yōu)點(diǎn)
Devfs 讓很多事變得容易許多。請(qǐng)考慮一下創(chuàng)建一張 Linux 可引導(dǎo)光盤的問(wèn)題,它包括一個(gè)位于 CD 上的引導(dǎo)裝載器、一個(gè) initrd、一個(gè)內(nèi)核和一個(gè)回送文件系統(tǒng)。當(dāng) CD 引導(dǎo)時(shí),引導(dǎo)裝載器裝載內(nèi)核和 initrd,然后內(nèi)核執(zhí)行 initrd 上的 /linuxrc腳本。 /linuxrc 的主要任務(wù)是安裝 CD,從而使回送文件系統(tǒng)本身也可以被安裝和訪問(wèn)。
沒(méi)有 devfs, linuxrc 就需要“查看” /dev 中的很多特殊文件,它們可能有也可能沒(méi)有表示連接到系統(tǒng)的真實(shí)硬件。例如, linuxrc 會(huì)需要檢測(cè) /dev/hdc、/dev/scd0、/dev/hdb 和其它的設(shè)備以檢測(cè)“活動(dòng)的”光盤驅(qū)動(dòng)器設(shè)備。在檢測(cè)進(jìn)程中,很可能命中幾個(gè)“無(wú)用的”設(shè)備節(jié)點(diǎn)。
然而,使用 devfs, linuxrc 只在 /dev/cdroms 中尋找,它包含了系統(tǒng)中所有和 活動(dòng)的光盤驅(qū)動(dòng)器相關(guān)聯(lián)的特殊文件,不管是 IDE 的還是 SCSI 的。由于這種便捷的新式 devfs 約定,再不需要猜測(cè)了;只有活動(dòng)的設(shè)備才會(huì)列出,而且設(shè)備檢測(cè)代碼甚至不必?fù)?dān)心底層的光盤驅(qū)動(dòng)器的細(xì)節(jié),比如說(shuō)它使用什么 IDE 通道或者什么 SCSI ID。實(shí)際上,這是 devfs 的另一個(gè)主要好處;在我下一篇文章中,我們會(huì)看到 devfs 下 /dev 中的設(shè)備有全新的缺省位置。
實(shí)際上,如果您想訪問(wèn)一個(gè)特定的塊設(shè)備(如磁盤、分區(qū)、光盤驅(qū)動(dòng)器等等),事實(shí)上有 幾個(gè)不同的特殊文件可以引用。例如,我的服務(wù)器只有一個(gè) SCSI 光盤驅(qū)動(dòng)器;如果啟用了 devfs,我就可以通過(guò)安裝 /dev/cdroms/cdrom0 或 /dev/scsi/host0/bus0/target4/lun0/cd 訪問(wèn)它。兩種都引用同一個(gè)設(shè)備,我可以引用我認(rèn)為最方便的特殊文件。如果愿意,我還可以使用一種老式的設(shè)備名稱(/dev/sr0)訪問(wèn)光盤驅(qū)動(dòng)器,這都是因?yàn)橛幸粋€(gè)非常便捷的叫 devfsd的小程序。 devfsd 是一個(gè)有功能很多的程序,它負(fù)責(zé)創(chuàng)建老式的“兼容性”特殊文件,還允許您以很多種方式自定義 /dev。在我的下一篇文章中,我們會(huì)詳細(xì)討論 devfsd,到時(shí)我會(huì)一直引導(dǎo)您啟動(dòng) devfs 并在您自己的系統(tǒng)上運(yùn)行它。在那之前,請(qǐng)參考下面的參考資料以了解更多關(guān)于 devfs 的信息。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- FATFS文件系統(tǒng)詳解
- Nand Flash文件系統(tǒng)解決方案
- 文件系統(tǒng)原理資料下載
- FAT32文件系統(tǒng)的詳細(xì)資料介紹 32次下載
- FAT32文件系統(tǒng)說(shuō)明 16次下載
- 使用單片機(jī)實(shí)現(xiàn)文件系統(tǒng)的函數(shù)免費(fèi)下載
- CramFS根文件系統(tǒng)的移植解析 0次下載
- Linux日志文件系統(tǒng)解析 0次下載
- 《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng) 0次下載
- fat文件系統(tǒng)筆記 4次下載
- 構(gòu)造嵌入式Linux的文件系統(tǒng)
- 基于μC/OS-II的文件系統(tǒng)設(shè)計(jì)
- 車載MP3中Flash文件系統(tǒng)的設(shè)計(jì)與應(yīng)用
- 車載MP3中Flash文件系統(tǒng)的設(shè)計(jì)與應(yīng)用
- Linux文件系統(tǒng)課程 0次下載
- 如何修改buildroot和debian文件系統(tǒng) 254次閱讀
- Linux系統(tǒng)如何擴(kuò)展文件系統(tǒng) 686次閱讀
- Linux 文件系統(tǒng)層的主要結(jié)構(gòu) 872次閱讀
- 執(zhí)行iPhone、iPad和iPodTouch設(shè)備的完整文件系統(tǒng)和邏輯采集 517次閱讀
- 如何制作ubuntu20.04的文件系統(tǒng) 3488次閱讀
- Linux文件系統(tǒng)的類型及工作原理 564次閱讀
- 深入剖析Linux內(nèi)核虛擬文件系統(tǒng) 2952次閱讀
- 文件系統(tǒng)FatFS和LittleFS的區(qū)別 6061次閱讀
- 什么是分布式文件系統(tǒng) 3990次閱讀
- 基于Buildroot的Linux系統(tǒng)構(gòu)建之根文件系統(tǒng) 2478次閱讀
- 使用RT-Thread文件系統(tǒng) 8484次閱讀
- Xilinx Zynq制作修改根文件系統(tǒng)的方法 3436次閱讀
- 文件系統(tǒng)是什么?淺談EXT文件系統(tǒng)歷史 5548次閱讀
- debian安裝zfs文件系統(tǒng) 1w次閱讀
- 玩轉(zhuǎn)Linux,先把文件系統(tǒng)搞懂 2009次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多