簡介

整體而言,裝置驅動程式的工作是針對特定裝置提供統一的介面,同時隱藏裝置實作的具體詳細資料。

舉例來說,兩個不同的乙太網路驅動程式 (例如兩者皆允許用戶端使用完全相同的 C 語言函式),將封包傳送至介面。即使硬體不同,每個驅動程式庫也會負責管理自己的硬體,確保用戶端介面完全相同。

請注意,驅動程式庫提供的介面可能為「中繼」,也就是說,這些介面不一定代表鏈結中的「最終」裝置。

假設使用的是 PCI 型乙太網路裝置。首先,您需要具備基本 PCI 驅動程式庫,並瞭解要如何與 PCI 匯流排本身通訊。此驅動程式庫對乙太網路一無所知,但知道如何處理機器上的特定 PCI 晶片組。

它會列舉公車上的裝置、從每部裝置上的不同暫存器收集資訊,並提供可讓用戶端 (例如 PCI 型乙太網路驅動程式庫) 執行 PCI 作業的功能,例如分配中斷或 DMA 管道。

因此,這個基本 PCI 驅動程式庫會為乙太網路驅動程式庫提供服務,讓乙太網路驅動程式庫管理相關硬體。

同時,其他裝置 (例如顯示卡) 也能以類似方式管理硬體的 PCI 驅動程式。

Fuchsia 模型

為了提供最大的彈性,位於 Fuchsia 世界的驅動程式可以繫結至相符的「父項」裝置,並發布自己的「子項」。此階層會視需要延伸:一個驅動程式庫可以發布子項,只有另一個驅動程式庫會將子項視為其父項,而第二個驅動程式庫會發布自己的子項,依此類推。

為瞭解運作方式,我們來看看以 PCI 為基礎的乙太網路範例。

首先,系統會提供特殊的「PCI 根」父項。實際上,這會顯示「我知道這個系統有 PCI 匯流排,找到時,會在這裡繫結至該系統。」

系統會評估驅動程式 (搜尋目錄),並自動繫結相符的驅動程式。

在這個情況下,系統會找到繫結至「PCI 根」父項的驅動程式庫並繫結。

這是基本 PCI 驅動程式庫。這項工作的工作是設定 PCI 匯流排,並列舉匯流排上的周邊裝置。

PCI 匯流排有識別週邊裝置的特定慣例:結合供應商 ID (VID) 和裝置 ID (DID) 的組合,專門用來識別所有可能的 PCI 裝置。在列舉期間,系統會從週邊裝置讀取這些值,並發布新的父項節點,其中包含偵測到的 VID 和 DID (以及代管其他資訊)。

每次發布新裝置時,都會重複執行上述 (針對初始 PCI 根裝置發布) 相同的程序;也就是說,系統會評估驅動程式,搜尋符合新父項特性的驅動程式。

雖然我們透過 PCI 根裝置搜尋的是符合某種功能 (稱為「通訊協定」) 的驅動程式庫,但這種情況很快就會顯示,但在這種情況下,我們會搜尋符合不同通訊協定的驅動程式,也就是符合「屬於 PCI 裝置且具有特定 VID 和 DID 要求的驅動程式」。

如果找到適合的驅動程式庫 (符合必要的通訊協定 VID 和 DID 的驅動程式),就會繫結至父項。

在繫結過程中,我們會初始化驅動程式庫,包括設定用於作業、啟動介面,以及發布這部裝置的子項或子項等作業。如果是 PCI 乙太網路驅動程式庫,會發布「乙太網路」介面,該介面與另一個通訊協定稱為「乙太網路實作」通訊協定。這個通訊協定代表一個與用戶端所用函式相近的通用通訊協定 (但目前已移除其中一個步驟,我們接下來會介紹這種通訊協定)。