驅動程式架構 (DFv2)

Fuchsia 的驅動程式庫架構是一系列的程式庫、工具、中繼資料和元件,可讓開發人員建立、執行、測試和發布 Fuchsia 系統的驅動程式。驅動程式庫架構旨在提供穩定的 ABI,讓開發人員只需編寫一次驅動程式庫,然後將該驅動程式部署到多個 Fuchsia 平台的版本。(但 Fuchsia 的驅動程式庫架構不斷演進,尚未達到 ABI 穩定性)。

驅動程式庫架構包含下列實體,可在 Fuchsia 系統中執行驅動程式:

駕駛管理員

Fuchsia 的驅動程式管理器做為 Fuchsia 元件 (driver_manager.cm) 執行,是 Fuchsia 系統啟動時的初始程序之一。驅動程式管理器會啟動和停止 Fuchsia 系統中的駕駛員,並將 FIDL 功能轉送給驅動程式。

驅動程式管理器會維護 Fuchsia 系統中所有已知裝置 (或節點) 的拓撲。當驅動程式管理器在系統中看見代表新裝置的節點時,便會要求驅動程式索引 (Fuchsia 元件) 找出正確的驅動程式庫,以便bind至該節點。當驅動程式庫比對到節點時,驅動程式管理器接著會建立新的驅動程式主機 (或重複使用現有的驅動程式代管程序),也會以元件的形式執行。驅動程式代管程序會啟動驅動程式庫的執行個體,並開始將裝置服務提供給系統中其他 Fuchsia 元件。

此外,驅動程式管理器會代管名為 devfs 的虛擬檔案系統 (如「裝置檔案系統」)。所有非驅動程式庫元件都會使用此 devfs 探索系統中執行的驅動程式所提供的服務。

驅動程式主機

每位驅動程式庫都位於驅動程式代管程序中,這個元件會以 Fuchsia 元件 (driver_host.cm) 的形式運作。驅動程式主機可隔離 Fuchsia 系統中的驅動程式。每個驅動程式代管程序都是一個程序,代表其擁有專屬的位址空間,並管理自己的執行緒組合。

驅動程式管理器將驅動程式庫繫結至節點後,會要求驅動程式代管程序建立驅動程式庫的執行個體。接著驅動程式代管程序會初始化驅動程式庫。驅動程式的初始化作業涉及呼叫驅動程式庫的啟動掛鉤 (驅動程式程式碼中的 Start() 函式),並將驅動程式繫結的節點移交給驅動程式庫。

多個驅動程式庫可置於單一驅動程式代管程序中。驅動程式庫繫結至節點後,驅動程式庫通常會放置在新的驅動程式庫主機中。然而,驅動程式庫也可以選擇將驅動程式置於與父項驅動程式庫相同的驅動程式主機中。當驅動程式位於同一驅動程式代管程序時,會共用相同的位址空間。

alt_text

圖 1:驅動程式主機代表已連接至 PCI 匯流排的 USB 裝置。

驅動程式索引

做為 Fuchsia 元件 (driver-index.cm) 執行的驅動程式庫索引負責下列工作:

  • 追蹤系統中所有可用的驅動程式,其中每個驅動程式庫都會與中繼資料 (例如元件網址和繫結規則) 儲存位置。
  • 將所有已知驅動程式與目標節點 (即系統中的裝置) 進行比較,以進行比對。

驅動程式索引會追蹤 Fuchsia 系統中下列類型的驅動程式:

  • 啟動驅動程式:存在 Zircon 開機映像檔 (ZBI) 的驅動程式,需要啟動系統 (例如儲存體驅動程式)。與基本驅動程式相比,ZBI 的空間有限。
  • 基本驅動程式:Fussia 映像檔中可用的驅動程式,對系統啟動作業沒有影響。這些驅動程式會從系統儲存空間載入,因此需在啟動驅動程式啟用儲存空間 (例如 USB 驅動程式、網路驅動程式) 後載入這些驅動程式。這些驅動程式和 Fuchsia 的基本套件類似。
  • Universe 驅動程式:在系統初始啟動 (例如使用 ffx driver registerbazel run 指令) 後手動註冊的驅動程式 (例如使用 ffx driver registerbazel run 指令)。這類驅動程式會使用宇宙套件解析器載入,類似 Fuchsia 的宇宙套件。不過,註冊宇宙驅動程式僅支援驅動程式庫程式。

當驅動程式管理器需要在節點拓撲中找到不繫結節點的驅動程式庫時,會使用 MatchDriver FIDL 通訊協定傳送比對要求至驅動程式庫索引。接著,驅動程式庫索引會根據所追蹤的每個驅動程式庫的繫結規則,評估節點屬性 (包含在比對要求中)。如有相符項目,驅動程式庫索引會將相符的驅動程式中繼資料傳回驅動程式管理器。但如果不相符,驅動程式庫索引會傳回 Not Found 錯誤代碼。(如要進一步瞭解繫結規則和繫結程序,請參閱「驅動程式繫結」。)

驅動程式執行階段

大致來說,驅動程式庫會與 Fauchsia 系統中的以下三個群組進行通訊:驅動程式庫架構、其他驅動程式,以及非驅動程式庫元件。大多數通訊都是透過 Zircon 管道使用 FIDL 呼叫。然而,在驅動程式庫執行階段中,在同一程序內將驅動程式放在相同位置,可避免進入或退出 Zircon 核心。換句話說,驅動程式庫執行階段會提供一種機制,讓相同位置的驅動程式能在本機相互通訊,效率比使用核心通道進行通訊的效率更高。驅動程式庫執行階段是依據 Zircon 核心建立而成的處理中執行階段。驅動程式庫執行階段會提供類似於 Zircon 管道和通訊埠的基本功能,並建構在這個執行階段之上建立新的 FIDL 傳輸。(詳情請參閱驅動程式庫執行階段的 RFC 說明)。

FIDL 介面

驅動程式庫程式架構中的 FIDL 介面參照下列兩種 FIDL 通訊協定:

這兩種通訊協定的組合是驅動程式與驅動程式庫程式架構的通訊基礎。架構支援的其他通訊協定主要用於不同驅動程式庫架構實體 (即驅動程式管理器、驅動程式庫索引、驅動程式庫主機等) 之間的內部通訊。

在非驅動程式庫元件與驅動程式庫程式架構之間,也使用了一些輔助 FIDL 通訊協定。舉例來說,fuchsia.driver.development FIDL 程式庫提供了多項偵錯通訊協定,供偵錯工具使用。我們也提供了一些通訊協定,讓您註冊新驅動程式及處理關機問題。不過,其中大多數方式對驅動程式庫開發人員而言並不特別有趣。