国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
LFS 系統(tǒng)的設(shè)備和模塊處理《Linux 徹底定制指南》[翻譯:金步國]

LFS 系統(tǒng)的設(shè)備和模塊處理

Chapter 6 里,我們安裝了 Udev 軟件包,在開始深入討論它如何工作之前,我們先簡要回顧一下以前處理設(shè)備的方法。

傳統(tǒng)上一般 Linux 系統(tǒng)使用創(chuàng)建靜態(tài)設(shè)備的方法,因此在 /dev 目錄下創(chuàng)建了大量的設(shè)備節(jié)點(有時會有數(shù)千個節(jié)點),而不管對應(yīng)的硬件設(shè)備實際上是否存在。這通常是由 MAKEDEV 腳本完成的,這個腳本包含許多調(diào)用 mknod 程序的命令,為這個世界上可能存在的每個設(shè)備創(chuàng)建相應(yīng)的主設(shè)備號和次設(shè)備號。而使用 udev 方式的時候,只有被內(nèi)核檢測到的設(shè)備才為其創(chuàng)建設(shè)備節(jié)點。因為每次系統(tǒng)啟動的時候都要重新創(chuàng)建這些設(shè)備節(jié)點,所以它們被存儲在 tmpfs 文件系統(tǒng)(一種完全存在于內(nèi)存里,不占用任何磁盤空間的文件系統(tǒng))上,設(shè)備節(jié)點不需要很多磁盤空間,所占用的內(nèi)存可以忽略不計。

7.4.1. 歷史

2000 年 2 月的時候,2.3.46 版本的內(nèi)核引入了一種稱為 devfs 的文件系統(tǒng),在 2.4 系列穩(wěn)定版本的內(nèi)核中都是可用的。盡管它存在于內(nèi)核源代碼中,但這種動態(tài)創(chuàng)建設(shè)備的方法卻從未得到核心內(nèi)核開發(fā)者們的全力支持。

devfs 存在的主要的問題是它處理設(shè)備檢測、創(chuàng)建和命名的方式,其中設(shè)備節(jié)點的命名可能是最嚴(yán)重的問題。一般可接受的方式是,如果設(shè)備名是可配置的,那么設(shè)備命名策略應(yīng)該由系統(tǒng)管理員決定,而不是由某些開發(fā)者強(qiáng)制規(guī)定。devfs 文件系統(tǒng)還存在競爭條件(race conditions)的問題,這是它天生的設(shè)計缺陷,不對內(nèi)核做徹底的修改就無法修正這個問題。因為近來缺乏維護(hù),它已經(jīng)被標(biāo)記為 deprecated(反對的)。

隨著非穩(wěn)定的 2.5 內(nèi)核樹的開發(fā),即后來發(fā)布的 2.6 系列穩(wěn)定版本內(nèi)核,一種被稱為 sysfs 的新虛擬文件系統(tǒng)誕生了。sysfs 的工作是把系統(tǒng)的硬件配置視圖導(dǎo)出給用戶空間的進(jìn)程。由于有了這個用戶空間可見的表示,代替 devfs 方案的時機(jī)就成熟了。

7.4.2. Udev 實現(xiàn)

上面簡單的提到了 sysfs 文件系統(tǒng),您可能想知道 sysfs 是怎么認(rèn)出系統(tǒng)中存在的設(shè)備以及應(yīng)該使用什么設(shè)備號。對于已經(jīng)編入內(nèi)核的驅(qū)動程序,當(dāng)被內(nèi)核檢測到的時候,會直接在 sysfs 中注冊其對象;對于編譯成模塊的驅(qū)動程序,當(dāng)模塊載入的時候才會這樣做。一旦掛載了 sysfs 文件系統(tǒng)(掛載到 /sys),內(nèi)建的驅(qū)動程序在 sysfs 注冊的數(shù)據(jù)就可以被用戶空間的進(jìn)程使用,并提供給 udev 以創(chuàng)建設(shè)備節(jié)點。

S10udev 初始化腳本負(fù)責(zé)在 Linux 啟動的時候創(chuàng)建設(shè)備節(jié)點,該腳本首先將 /sbin/udevsend 注冊為熱插拔事件處理程序。熱插拔事件(隨后將討論)本不應(yīng)該在這個階段發(fā)生,注冊 udev 只是為了以防萬一。然后 udevstart 遍歷 /sys 文件系統(tǒng),并在 /dev 目錄下創(chuàng)建符合描述的設(shè)備。例如,/sys/class/tty/vcs/dev 里含有"7:0"字符串,udevstart 就根據(jù)這個字符串創(chuàng)建主設(shè)備號為 7 、次設(shè)備號為 0/dev/vcs 設(shè)備。udevstart 創(chuàng)建的每個設(shè)備的名字和權(quán)限由 /etc/udev/rules.d/ 目錄下的文件指定的規(guī)則來設(shè)置,這些文件以類似于 LFS 啟動腳本風(fēng)格的編號。如果 udev 找不到所創(chuàng)建設(shè)備的權(quán)限文件,就將其權(quán)限設(shè)置為缺省的 660 ,所有者為 root:root 。

上面的步驟完成后,那些已經(jīng)存在并且已經(jīng)內(nèi)建驅(qū)動的設(shè)備就可以使用了,那么以模塊驅(qū)動的設(shè)備呢?

前面我們提到了"熱插拔事件處理程序"的概念,當(dāng)內(nèi)核檢測到一個新設(shè)備連接時,內(nèi)核會產(chǎn)生一個熱插拔事件,并在 /proc/sys/kernel/hotplug 文件里查找處理設(shè)備連接的用戶空間程序。udev 初始化腳本將 udevsend 注冊為該處理程序。當(dāng)產(chǎn)生熱插拔事件的時候,內(nèi)核讓 udev/sys 文件系統(tǒng)里檢測與新設(shè)備的有關(guān)信息,并為新設(shè)備在 /dev 里創(chuàng)建項目。

這樣帶來了 udev 存在的一個問題,之前 devfs 也存在同樣的問題。這通常是個"先有雞還是先有蛋"問題。大多數(shù) Linux 發(fā)行版通過 /etc/modules.conf 配置文件來處理模塊加載,對某個設(shè)備節(jié)點的訪問導(dǎo)致相應(yīng)的內(nèi)核模塊被加載。對 udev 這個方法就行不通了,因為在模塊加載前,設(shè)備節(jié)點根本不存在。為了解決這個問題,在 LFS-Bootscripts 軟件包里加入了 S05modules 啟動腳本,以及 /etc/sysconfig/modules 文件。通過在 modules 文件里添加模塊名,就可以在系統(tǒng)啟動的時候加載這些模塊,這樣 udev 就可以檢測到設(shè)備,并創(chuàng)建相應(yīng)的設(shè)備節(jié)點了。

注意,在慢速的機(jī)器上,或者對于需要創(chuàng)建大量設(shè)備節(jié)點的驅(qū)動程序,創(chuàng)建設(shè)備的過程可能需要好幾秒鐘,這意味著某些設(shè)備節(jié)點不能立即訪問到。

7.4.3. 處理可熱插拔/動態(tài)設(shè)備

當(dāng)您插入一個設(shè)備,例如一個 USB 接口的 MP3 播放器,內(nèi)核會檢測到設(shè)備連接,并產(chǎn)生一個熱插拔事件,如果驅(qū)動程序已經(jīng)加載(要么是因為驅(qū)動已經(jīng)編入內(nèi)核,要么是已經(jīng)通過 S05modules 啟動腳本加載了),udev 將被調(diào)用,并根據(jù) /sys 目錄下的 sysfs 數(shù)據(jù)來創(chuàng)建相應(yīng)的設(shè)備節(jié)點。如果該設(shè)備的驅(qū)動是一個未加載的模塊,將設(shè)備連接到系統(tǒng)上只會讓內(nèi)核的總線驅(qū)動產(chǎn)生一個熱插拔事件,通知用戶空間有新設(shè)備連接,但并不加載驅(qū)動。事實上,什么都沒有做,設(shè)備仍然不能使用。

如果剛才插入的設(shè)備有一個驅(qū)動程序模塊但是尚未加載,Hotplug 軟件包就有用了,它就會響應(yīng)上述的內(nèi)核總線驅(qū)動熱插拔事件并加載相應(yīng)的模塊,為其創(chuàng)建設(shè)備節(jié)點,這樣設(shè)備就可以使用了。

7.4.4. 創(chuàng)建設(shè)備的問題

自動創(chuàng)建設(shè)備節(jié)點的時候,存在一些已知的問題:

1) 某個內(nèi)核驅(qū)動可能沒有將其數(shù)據(jù)導(dǎo)出到 sysfs 。

這個問題在內(nèi)核源代碼樹之外的第三方驅(qū)動程序上尤其常見,結(jié)果是這些驅(qū)動無法創(chuàng)建其設(shè)備節(jié)點。用 /etc/sysconfig/createfiles 配置文件手動創(chuàng)建這些設(shè)備,參考內(nèi)核文檔里的 devices.txt 文件或者該驅(qū)動的文檔以獲得正確的主/次設(shè)備號。

2) 需要一個非硬件設(shè)備,這個問題通常出現(xiàn)在 ALSA(高級 Linux 聲音架構(gòu))項目里的 OSS(開放聲音系統(tǒng))兼容模塊上,這類設(shè)備可以用下面兩種方法之一來處理:

  • 將模塊名添加到 /etc/sysconfig/modules

  • /etc/modprobe.conf 文件里使用"install"命令行,讓 modprobe 命令"在加載這個模塊的同時加載另一模塊"。例如:

    install snd-pcm modprobe -i snd-pcm ; modprobe     snd-pcm-oss ; true

    這個命令使系統(tǒng)在收到任何加載 snd-pcm 驅(qū)動請求的時候,都同時加載 snd-pcmsnd-pcm-oss 模塊。

7.4.5. 有用的讀物

一些有用的補(bǔ)充文檔可以在下列網(wǎng)站得到:

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Udev:介紹現(xiàn)代Linux系統(tǒng)的設(shè)備管理
Linux設(shè)備模型、Sysfs文件系統(tǒng)與udev設(shè)備文件
Linux 熱插拔(Hot Plug)處理機(jī)制系列
教你寫第一個Linux設(shè)備驅(qū)動程序
關(guān)于熱插拔usb hotplug /proc/sys/kernel mdev udev b...
Linux里udev的工作原理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服