Fuchsia 的驅動程式庫架構是一組程式庫、工具、中繼資料和元件,可供開發人員為 Fuchsia 系統建立、執行、測試及發布驅動程式。驅動程式庫架構的目標是提供穩定的 ABI,讓開發人員編寫一次驅動程式庫,即可部署到多個版本的 Fuchsia 平台。(不過,Fuchsia 的驅動程式庫架構不斷演進,尚未達到 ABI 穩定性。)
驅動程式庫架構包含下列實體,可在 Fuchsia 系統中執行驅動程式:
驅動程式管理器
Fuchsia 的驅動程式管理器會以 Fuchsia 元件 (driver_manager.cm) 的形式執行,是 Fuchsia 系統啟動時最先啟動的程序之一。驅動程式管理器會在 Fuchsia 系統中啟動及停止驅動程式,並為驅動程式傳送 FIDL 功能。
驅動程式管理器會維護 Fuchsia 系統中所有已知裝置 (或節點) 的拓撲。當驅動程式管理器在系統中看到代表新裝置的節點時,會要求驅動程式索引 (Fuchsia 元件) 找出要繫結至該節點的正確驅動程式庫。驅動程式庫與節點相符時,驅動程式管理器會建立新的驅動程式代管程序 (或重複使用現有的驅動程式代管程序),這也會以元件的形式執行。驅動程式代管程序會啟動驅動程式庫的執行個體,並開始為系統中的其他 Fuchsia 元件提供裝置的服務。
驅動程式代管程序
每個驅動程式庫都位於驅動程式代管程序中,驅動程式代管程序以 Fuchsia 元件 (driver_host.cm) 形式執行。驅動程式代管程序可在 Fuchsia 系統中隔離驅動程式。每個驅動程式代管程序都是一個程序,也就是說,每個主機都有自己的位址空間,並管理自己的執行緒集。
驅動程式管理器將驅動程式庫繫結至節點後,會要求驅動程式代管程序建立驅動程式庫的執行個體。驅動程式代管程序接著會初始化驅動程式庫。驅動程式的初始化作業包括呼叫驅動程式庫的啟動掛鉤 (驅動程式程式碼中的 Start() 函式),並將節點的控制權交給驅動程式庫程式,節點會繫結至驅動程式。
單一驅動程式代管程序中可共置多個驅動程式庫。將驅動程式庫繫結至節點後,驅動程式庫通常會放置在新的驅動程式庫主機中。不過,驅動程式庫也可以選擇與上層驅動程式庫放在同一個驅動程式庫主機。如果驅動程式位於同一個驅動程式代管程序中,就會共用相同的位址空間。
圖表 1。代表連線至 PCI 匯流排的 USB 裝置的驅動程式主機。
驅動程式索引
驅動程式庫索引 (以 Fuchsia 元件 driver-index.cm 形式執行) 負責下列工作:
驅動程式索引會追蹤 Fuchsia 系統中的下列驅動程式類型:
- 開機驅動程式:存在於 Zircon 開機映像檔 (ZBI) 中,且是系統啟動程序所需的驅動程式 (例如儲存空間驅動程式)。與基本驅動程式相比,ZBI 的空間有限。
- 基本驅動程式:Fuchsia 映像檔中提供的驅動程式,並非系統啟動的必要元件。這些驅動程式會從系統的儲存空間載入,因此必須在開機驅動程式啟用儲存空間後載入 (例如 USB 驅動程式、網路驅動程式)。這與 Fuchsia 的基本套件類似。
- Universe 驅動程式:在系統首次啟動後手動註冊的驅動程式 (例如使用
ffx driver register或bazel run指令),這類驅動程式會使用 Universe 套件解析器載入,類似於 Fuchsia 的 Universe 套件。不過,註冊通用驅動程式僅適用於驅動程式庫開發用途。
當驅動程式管理器需要為節點拓撲中的未繫結節點尋找驅動程式庫時,會使用 MatchDriver FIDL 通訊協定,將比對要求傳送至驅動程式庫索引。然後,驅動程式庫索引會根據追蹤的每個驅動程式庫的繫結規則,評估節點屬性 (包含在比對要求中)。如果相符,驅動程式庫索引會將相符驅動程式的中繼資料傳回驅動程式管理器。但如果沒有相符項目,驅動程式庫索引會以 Not Found 錯誤代碼回應。(如要進一步瞭解繫結規則和繫結程序,請參閱「驅動程式繫結」一文)。
驅動程式執行階段
從高層次來看,驅動程式庫會在 Fuchsia 系統中與下列三組項目通訊:驅動程式庫架構、其他驅動程式和非驅動程式庫元件。大部分的通訊都是透過 Zircon 管道的 FIDL 呼叫進行。不過,如果使用驅動程式庫執行階段,同一個程序中的共置驅動程式可以避免進出 Zircon 核心。換句話說,驅動程式庫執行階段提供一種機制,讓位於同一位置的驅動程式可在本機相互通訊,這比使用核心管道通訊的效率高得多。驅動程式庫執行階段是仿照 Zircon 核心的程序內執行階段。驅動程式庫程式執行階段提供的基本類型與 Zircon 管道和通訊埠類似,而新的 FIDL 傳輸機制是以這個執行階段為基礎建構而成。(詳情請參閱驅動程式庫執行階段的 RFC)。
FIDL 介面
驅動程式庫程式架構中的 FIDL 介面是指下列兩項 FIDL 通訊協定:
這兩種通訊協定結合後,就成為驅動程式與驅動程式庫程式架構通訊的基礎。架構支援的其他通訊協定,主要用於各種驅動程式庫架構實體 (即驅動程式管理器、驅動程式庫索引、驅動程式庫代管程序等) 之間的內部通訊。
非驅動程式庫元件和驅動程式庫程式架構之間也會使用一些輔助 FIDL 通訊協定。舉例來說,我們在 fuchsia.driver.development FIDL 程式庫中提供多種偵錯通訊協定,供偵錯工具使用。我們也提供註冊新驅動程式和處理關機的通訊協定。不過,對驅動程式庫開發人員來說,這些大多不是特別有趣。