在Linux系統(tǒng)中,/dev目錄中包含了特殊的文件(即設(shè)備文件),正是由于這些設(shè)備文件的存在,才允許用戶空間的應(yīng)用程序訪問由Linux內(nèi)核管理的硬件設(shè)備。如果沒有這些設(shè)備文件,即使Linux內(nèi)核正確識(shí)別了硬件設(shè)備,用戶空間的應(yīng)用程序也無(wú)法使用它們。
所以,位于/dev目錄下的設(shè)備文件是用戶空間程序與硬件設(shè)備進(jìn)行交流的中間媒介。
buildroot對(duì)/dev的四種處理方式
在buildroot中,提供了四種方式來(lái)處理/dev目錄,他們位于System configuration選項(xiàng)下的/dev management選項(xiàng)中:
(1)第一種方式是Static using device table
這是 Linux處理設(shè)備文件的傳統(tǒng)方法。使用這種方法,設(shè)備文件會(huì)被持久存儲(chǔ)在根文件系統(tǒng)中(即重新啟動(dòng)后它們?nèi)匀淮嬖冢⑶以谙到y(tǒng)添加或者移除硬件設(shè)備時(shí),不能自動(dòng)創(chuàng)建和刪除這些設(shè)備文件。因此,Buildroot 使用了設(shè)備表來(lái)創(chuàng)建一組標(biāo)準(zhǔn)的設(shè)備文件,默認(rèn)設(shè)備表存儲(chǔ)在Buildroot源代碼的system/device_table_dev.txt文件中。文件中內(nèi)容按照:
格式進(jìn)行設(shè)備文件定義。
name : 要?jiǎng)?chuàng)建或修改的文件的路徑。
type :是文件的類型。f: 常規(guī)文件、d: 目錄、r: 遞歸目錄、c: 字符設(shè)備文件、b: 塊設(shè)備文件、p: 命名管道。
mode :通常的權(quán)限設(shè)置(僅允許使用數(shù)值)。
uid 和 gid 是要在此文件上設(shè)置的 UID 和 GID;可以是數(shù)值或者實(shí)際名稱。
major 和 minor 這里用于設(shè)備文件,其他文件需設(shè)置為“-”。
start,inc 和 count 適用于要?jiǎng)?chuàng)建一批文件的情況,實(shí)則為一個(gè)循環(huán),從start開始,以inc為單位遞增計(jì)數(shù)器,直至達(dá)到count。
Buildroot在生成最終的根文件系統(tǒng)鏡像時(shí)才會(huì)處理這個(gè)設(shè)備表文件,因此設(shè)備文件在output/target 目錄中是不可見的。BR2_ROOTFS_STATIC_DEVICE_TABLE選項(xiàng)用于更改Buildroot默認(rèn)使用的設(shè)備表,或者添加其他設(shè)備表,以便Buildroot在構(gòu)建過(guò)程中可以創(chuàng)建其他設(shè)備文件。因此,如果使用此方法,并且系統(tǒng)中缺少設(shè)備文件,則可以創(chuàng)建一個(gè)包含其他設(shè)備文件描述的board/
(2)第二種方式是Dynamic using devtmpfs only
devtmpfs是Linux內(nèi)核中的一個(gè)虛擬文件系統(tǒng),在內(nèi)核 2.6.32 中引入(如果使用較舊的內(nèi)核,則無(wú)法使用此選項(xiàng))。在掛載到/dev 后,此虛擬文件系統(tǒng)將在系統(tǒng)添加或者移除硬件設(shè)備時(shí)自動(dòng)顯示或者讓設(shè)備文件消失。
devtmpfs文件系統(tǒng)在重新啟動(dòng)后并不會(huì)持久,因?yàn)樗怯蓛?nèi)核動(dòng)態(tài)填充的。
使用devtmpfs時(shí)需要啟用以下內(nèi)核配置選項(xiàng):CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT。
(3)第三種方式是Dynamic using devtmpfs+mdev
該方法同樣依賴于 devtmpfs 虛擬文件系統(tǒng)(因此同樣需要在內(nèi)核配置中啟用 CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT),但添加了 mdev 用戶空間程序。mdev是 BusyBox 里面的一個(gè)重要組成程序,每次添加或移除設(shè)備時(shí),內(nèi)核都會(huì)調(diào)用mdev。
我們可以使用/etc/mdev.conf配置文件配置mdev,例如給設(shè)備文件設(shè)置特定的權(quán)限或所有權(quán)、在設(shè)備出現(xiàn)或消失時(shí)調(diào)用腳本或應(yīng)用程序等等。允許用戶空間對(duì)設(shè)備添加和刪除事件做出反應(yīng)。例如:當(dāng)設(shè)備出現(xiàn)在系統(tǒng)上時(shí),mdev 可用于自動(dòng)加載內(nèi)核模塊。如果設(shè)備需要固件,則 mdev 也很重要,因?yàn)樗鼤?huì)負(fù)責(zé)將固件內(nèi)容推送到內(nèi)核。
mdev是udev的輕量級(jí)實(shí)現(xiàn)(功能較少)
(4)第四種方式是Dynamic using devtmpfs+eudev
此方法同樣依賴于devtmpfs虛擬文件系統(tǒng),但添加了eudev用戶空間守護(hù)程序。eudev 是后臺(tái)運(yùn)行的守護(hù)程序,當(dāng)系統(tǒng)添加或者移除設(shè)備時(shí),內(nèi)核將會(huì)調(diào)用eudev。
與 mdev 相比,它是重量級(jí)的解決方案,但是具有更高的靈活性。eudev是udev 的獨(dú)立版本,udev 是大多數(shù)桌面 Linux 發(fā)行版中使用的原始用戶空間守護(hù)程序,現(xiàn)已歸入Systemd中。
總結(jié)
在本文中,描述了buildroot對(duì)/dev的四種處理方式,在實(shí)際使用中,可以按照以下規(guī)則進(jìn)行選擇:
如果在設(shè)備添加或移除時(shí)不通知用戶空間,則選擇Dynamic using devtmpfs only方式。(Busybox、systemV和OpenRC三種初始化系統(tǒng)都支持)
如果在設(shè)備添加或移除時(shí)需要通知用戶空間或者需要固件,則選擇Dynamic using devtmpfs+mdev方式。(Busybox、systemV和OpenRC三種初始化系統(tǒng)都支持)
如果選擇systemd作為初始化系統(tǒng),則/dev 管理將由 systemd 提供的udev程序執(zhí)行。(僅支持systemd初始化系統(tǒng))
-
硬件
+關(guān)注
關(guān)注
11文章
3112瀏覽量
65848 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3198瀏覽量
57360 -
Buildroot
+關(guān)注
關(guān)注
1文章
48瀏覽量
1339
原文標(biāo)題:buildroot使用筆記-02 | /dev的四種管理機(jī)制
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論