裝置驅動程式與核心模組

驅動程式模型(driver model)

如果每個驅動程式都自創一套註冊、尋找硬體與清理的方式,核心就會一片混亂。驅動程式模型是核心共用的框架,把所有驅動程式、所有裝置,以及連接它們的匯流排,組織成一個一致的系統,讓單一驅動程式作者插上去即可,由核心處理繁瑣記帳。可以把它想成公司標準的招募與報到流程:每位專員(驅動程式)填同樣的表格,並被媒合到對的機器(裝置)。

在 Linux 中,這建立在三個核心概念上:匯流排(bus,如 PCI 或 USB,懂得如何列舉裝置)、裝置(device,被發現的一塊硬體)、驅動程式(driver,能處理某類裝置的程式碼)。模型維護一份登記簿:驅動程式註冊時列出它支援的裝置識別碼;當某裝置出現,匯流排核心把它媒合到一個驅動程式並呼叫該驅動程式的 probe 函式。這個媒合正是模型的核心——probe() 是驅動程式甦醒、宣告擁有其硬體、映射暫存器並註冊 IRQ 之處,而 remove() 是它放手之處。整棵由匯流排、裝置與驅動程式構成的樹會映射到 /sys(sysfs)底下,讓使用者空間看得見。

它之所以重要,是因為它把熱插拔、電源管理與參考計數變成共用基礎設施,而非每個驅動程式各自重造。當你插入 USB 隨身碟時,你正看著驅動程式模型運作:USB 匯流排列舉出新裝置、媒合到 usb-storage 驅動程式、呼叫 probe(),於是一個新磁碟出現。一個常見混淆:驅動程式模型不等於單一驅動程式——它是所有驅動程式掛靠的鷹架,而把它的鉤子(probe、remove、suspend、resume)寫對,正是撰寫現代驅動程式的大部分工作。

// 一個 PCI 驅動程式註冊它能處理什麼: static const struct pci_device_id my_ids[] = { { PCI_DEVICE(0x10ec, 0x8168) }, // 廠商、裝置 { 0, } }; // 當相符的裝置出現,核心會呼叫 my_probe(dev)

驅動程式宣告它支援的(廠商、裝置)識別碼;匯流排核心負責媒合並呼叫 probe()。

probe() 可能在任何時刻被呼叫(熱插拔),甚至在模組載入後很久才被叫到,而且可能失敗——它必須在回傳錯誤前清理它配置過的一切,否則會洩漏核心資源。

又稱
device-driver frameworkLinux device model驅動程式框架