裝置驅動程式與核心模組

匯流排列舉(bus enumeration)

有些硬體能自我介紹。當你插入 USB 隨身碟時,系統會自行弄清楚它是什麼、誰做的、需要什麼驅動程式。匯流排列舉就是這個發現的過程:核心走遍一條匯流排、問每個連接的裝置「你是誰?」,每個裝置以識別編號回答,於是核心能把它媒合到驅動程式並讓它活起來。這與裝置樹相反,後者正是在硬體無法自我介紹時才需要。

具體而言,一條可發現的匯流排有標準方式可查詢裝置。在 PCI 上,每個裝置暴露一個組態空間(configuration space)——一小組暫存器,核心可在已知偏移處讀取,以取得它的廠商識別碼、裝置識別碼、類別,以及它暫存器區域的位址(它的 BAR,基底位址暫存器)。PCI 核心掃描所有匯流排/裝置/功能插槽、讀每個組態空間,並建立一份存在裝置的清單。在 USB 上,當裝置被插入時,主機控制器偵測到它、指派一個位址,並讀取它的描述符(廠商、產品、類別、端點)。兩種情況結果相同:一個(廠商、裝置)身分,驅動程式模型拿它與每個驅動程式支援識別碼的表做媒合,然後呼叫勝出驅動程式的 probe。

匯流排列舉之所以重要,是因為它正是隨插即用得以運作的原因:你接上網路攝影機時不必編輯設定檔,匯流排會發現它、正確的驅動程式就載入。要記住的誠實對照:列舉只對被設計成自我描述的匯流排(PCI、USB、Thunderbolt)有效。沒有發現機制、焊死的固定硬體——在嵌入式系統中很常見——無法被列舉,必須由裝置樹或 ACPI 在頻外描述。列舉找出存在的東西;它不發明身分,所以一個識別碼回報錯誤的裝置會媒合到錯的驅動程式或沒有驅動程式。

$ lspci -nn | head -1 00:02.0 VGA [0300]: Intel ... [8086:5917] // 類別 廠商:裝置 // PCI 核心讀了這個裝置的組態空間以得知 // 廠商 0x8086、裝置 0x5917,然後媒合到一個驅動程式

列舉從每個裝置的組態空間讀出它的身分(此處廠商 0x8086、裝置 0x5917)並媒合驅動程式。

列舉只對自我描述的匯流排(PCI、USB)有效;固定的嵌入式硬體沒有發現機制,必須改由裝置樹或 ACPI 描述。

又称
device discoveryPCI/USB enumeration匯流排掃描