在Linux系統中,/dev目錄中包含了特殊的文件(即設備文件),正是由于這些設備文件的存在,才允許用戶空間的應用程序訪問由Linux內核管理的硬件設備。如果沒有這些設備文件,即使Linux內核正確識別了硬件設備,用戶空間的應用程序也無法使用它們。
所以,位于/dev目錄下的設備文件是用戶空間程序與硬件設備進行交流的中間媒介。
buildroot對/dev的四種處理方式
在buildroot中,提供了四種方式來處理/dev目錄,他們位于System configuration選項下的/dev management選項中:
(1)第一種方式是Static using device table
這是 Linux處理設備文件的傳統方法。使用這種方法,設備文件會被持久存儲在根文件系統中(即重新啟動后它們仍然存在),并且在系統添加或者移除硬件設備時,不能自動創建和刪除這些設備文件。
因此,Buildroot 使用了設備表來創建一組標準的設備文件,默認設備表存儲在Buildroot源代碼的system/device_table_dev.txt文件中。文件中內容按照:
格式進行設備文件定義。
name : 要創建或修改的文件的路徑。
type :是文件的類型。f: 常規文件、d: 目錄、r: 遞歸目錄、c: 字符設備文件、b: 塊設備文件、p: 命名管道。
mode :通常的權限設置(僅允許使用數值)。
uid 和 gid 是要在此文件上設置的 UID 和 GID;可以是數值或者實際名稱。
major 和 minor 這里用于設備文件,其他文件需設置為“-”。
start,inc 和 count 適用于要創建一批文件的情況,實則為一個循環,從start開始,以inc為單位遞增計數器,直至達到count。
Buildroot在生成最終的根文件系統鏡像時才會處理這個設備表文件,因此設備文件在output/target 目錄中是不可見的。
BR2_ROOTFS_STATIC_DEVICE_TABLE選項用于更改Buildroot默認使用的設備表,或者添加其他設備表,以便Buildroot在構建過程中可以創建其他設備文件。
因此,如果使用此方法,并且系統中缺少設備文件,則可以創建一個包含其他設備文件描述的board/
(2)第二種方式是Dynamic using devtmpfs only
devtmpfs是Linux內核中的一個虛擬文件系統,在內核 2.6.32 中引入(如果使用較舊的內核,則無法使用此選項)。在掛載到/dev 后,此虛擬文件系統將在系統添加或者移除硬件設備時自動顯示或者讓設備文件消失。
devtmpfs文件系統在重新啟動后并不會持久,因為它是由內核動態填充的。
使用devtmpfs時需要啟用以下內核配置選項:CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT。
(3)第三種方式是Dynamic using devtmpfs+mdev
該方法同樣依賴于 devtmpfs 虛擬文件系統(因此同樣需要在內核配置中啟用 CONFIG_DEVTMPFS 和 CONFIG_DEVTMPFS_MOUNT),但添加了 mdev 用戶空間程序。
mdev是 BusyBox 里面的一個重要組成程序,每次添加或移除設備時,內核都會調用mdev。
我們可以使用/etc/mdev.conf配置文件配置mdev,例如給設備文件設置特定的權限或所有權、在設備出現或消失時調用腳本或應用程序等等。
允許用戶空間對設備添加和刪除事件做出反應。例如:當設備出現在系統上時,mdev 可用于自動加載內核模塊。
如果設備需要固件,則 mdev 也很重要,因為它會負責將固件內容推送到內核。
mdev是udev的輕量級實現(功能較少)
(4)第四種方式是Dynamic using devtmpfs+eudev
此方法同樣依賴于devtmpfs虛擬文件系統,但添加了eudev用戶空間守護程序。eudev 是后臺運行的守護程序,當系統添加或者移除設備時,內核將會調用eudev。
與 mdev 相比,它是重量級的解決方案,但是具有更高的靈活性。eudev是udev 的獨立版本,udev 是大多數桌面 Linux 發行版中使用的原始用戶空間守護程序,現已歸入Systemd中。
總結
在本文中,描述了buildroot對/dev的四種處理方式,在實際使用中,可以按照以下規則進行選擇:
如果在設備添加或移除時不通知用戶空間,則選擇Dynamic using devtmpfs only方式。(Busybox、systemV和OpenRC三種初始化系統都支持)
如果在設備添加或移除時需要通知用戶空間或者需要固件,則選擇Dynamic using devtmpfs+mdev方式。(Busybox、systemV和OpenRC三種初始化系統都支持)
如果選擇systemd作為初始化系統,則/dev 管理將由 systemd 提供的udev程序執行。(僅支持systemd初始化系統)
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
596瀏覽量
27510 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21744 -
Buildroot
+關注
關注
1文章
48瀏覽量
1418
發布評論請先 登錄
相關推薦
評論