驅動程式繫結

如要為 Fuchsia 系統中的裝置提供服務,驅動程式必須繫結至代表裝置的節點。驅動程式管理器會維護節點的拓撲,其中每個節點代表系統中硬體或虛擬裝置的存取權。當驅動程式庫與節點相符時,驅動程式庫可以繫結至節點。繫結至節點後,驅動程式庫就能開始為節點代表的裝置提供服務。舉例來說,USB 鍵盤驅動程式庫可能會繫結至代表鍵盤裝置的節點。

如要判斷哪些驅動程式可以繫結至哪些節點,每個驅動程式庫都有繫結規則,每個節點則有一組節點屬性。驅動程式的繫結規則會說明節點的資格,驅動程式庫可有效服務該節點。當驅動程式庫程式架構嘗試將驅動程式庫與節點比對時,系統會將每個未繫結節點的屬性與驅動程式的繫結規則進行比較。如果節點屬性符合驅動程式的繫結規則,驅動程式庫架構就會允許驅動程式庫繫結至節點。

繫結序列

Fuchsia 系統啟動時,驅動程式管理器會嘗試建構節點拓撲,代表系統中的所有硬體和虛擬裝置,而驅動程式索引會列舉系統已知的所有驅動程式。

Fuchsia 系統首次啟動時,會發生下列事件:

  1. (從根節點及其驅動程式庫開始) 驅動程式要求驅動程式管理器建立新的子節點。
  2. 驅動程式管理器會要求驅動程式庫索引,找出最符合這個節點屬性的驅動程式庫:
    1. 驅動程式索引會根據節點的屬性,比較每個已知驅動程式庫的繫結規則。
    2. 驅動程式庫索引會將相符驅動程式的網址傳回給驅動程式管理器。
  3. 驅動程式管理器會將驅動程式庫繫結至節點:
    1. 驅動程式管理器會為驅動程式庫建立 (或指派) 驅動程式代管程序。
    2. 驅動程式代管程序會啟動驅動程式例項。
  4. 執行中的驅動程式庫可能會決定建立子節點。
    1. 從步驟 1 開始重複上述程序。

在初始掃描和繫結作業完成後,每當有新的驅動程式庫出現 (例如新的驅動程式庫載入系統),驅動程式管理器就會將拓撲中所有未繫結的節點傳送至驅動程式庫程式索引,與新的驅動程式庫進行比對。節點相符時,驅動程式管理器會將這個新驅動程式庫繫結至節點,驅動程式庫例項會放置在驅動程式代管程序中,而驅動程式代管程序則會開始將裝置功能提供給系統中的其他 Fuchsia 元件。

如要進一步瞭解繫結規則,請參閱繫結規則教學課程。

主機板驅動程式庫和 USB 裝置

驅動程式通常會繫結至裝置,但有些驅動程式 (例如 PCI 和 ACPI) 會繫結至主機板,且可能有多部裝置與這些驅動程式靜態和動態連結。

(例如 acpi) 會剖析系統傳遞的二進位大型物件 (可以是 ACPI 位元組碼或已編譯的裝置樹狀結構),並將主機板上連線的靜態裝置集告知驅動程式管理器工具。這些裝置會透過驅動程式庫索引協調的一般繫結程序,繫結至驅動程式。從這個時間點開始,這些驅動程式 (繫結至主機板驅動程式庫的子節點) 會動態查詢硬體,取得額外資訊。驅動程式可能會根據這項資訊,發現要新增至拓撲的新裝置。隨著更多裝置被發現並導入拓撲,這個程序會以遞迴方式進行。