閱讀英文

共用方式為


裝置節點和裝置堆疊

在 Windows 中,裝置會以隨插即用裝置樹狀結構中的裝置節點來表示。 一般而言,當 I/O 要求傳送至裝置時,有數個驅動程式可協助處理要求。 這些驅動程式都與裝置對象相關聯,且裝置物件會排列在堆疊中。 裝置物件的序列及其相關聯的驅動程式稱為裝置堆疊。 每個裝置節點都有自己的裝置堆疊。

裝置節點和隨插即用裝置樹狀結構

Windows 會將裝置排列成稱為 隨插即用裝置樹的樹狀結構,或簡稱 裝置樹。 一般而言,裝置樹狀結構中的節點代表裝置或複合裝置上的個別功能。 不過,某些節點代表與實體裝置沒有關聯的軟體元件。

裝置樹中的節點稱為 裝置節點。 裝置樹狀結構的根節點稱為 根裝置節點。 依照慣例,根裝置節點會繪製在裝置樹狀結構的底部,如下圖所示。

顯示裝置節點的裝置樹狀結構圖表。

裝置樹狀結構說明 PnP 環境中固有的父/子關聯性。 裝置樹狀結構中的數個節點代表已連接子裝置的總線。 例如,PCI 總線節點代表主機板上的實體PCI總線。 在啟動期間,PnP 管理員會要求PCI總線驅動程式列舉連線到PCI總線的裝置。 這些裝置是由PCI總線節點的子節點表示。 在上圖中,PCI 總線節點有數個連線到PCI總線的裝置的子節點,包括USB主機控制器、音訊控制器和PCI Express埠。

連接到PCI總線的一些裝置本身是公交車。 PnP 管理員會要求每個總線列舉與其連線的裝置。 在上圖中,我們可以看到音訊控制器是連接音訊裝置的總線。 我們可以看到,PCI Express埠是一個已連接顯示卡的總線,而顯示卡則是連接了一台顯示器的總線。

您是否將節點視為裝置或總線,取決於您的觀點。 例如,您可以將顯示卡視為在準備顯示在螢幕上的畫面時扮演重要角色的裝置。 不過,您也可以將顯示器適配卡視為能夠偵測和列舉連線監視器的總線。

裝置物件和裝置堆疊

裝置物件DEVICE_OBJECT 結構的實例。 PnP 裝置樹狀結構中的每個裝置節點都有一份已排序的裝置物件清單,而且每個裝置物件都與驅動程式相關聯。 裝置物件的排序列表及其相關聯的驅動程式稱為裝置節點的 裝置堆疊

您可以透過數種方式來思考裝置堆疊。 從最正式的意義上說,裝置堆疊是已排序的(裝置對象、驅動程式)配對清單。 不過,在某些內容中,將裝置堆疊視為已排序的裝置物件清單可能會很有用。 在其他內容中,將裝置堆疊視為已排序的驅動程式清單可能會很有用。

根據慣例,裝置堆疊具有頂端和底部。 在裝置堆疊中建立的第一個裝置對象位於底部,而要建立並連結至裝置堆疊的最後一個裝置對象位於頂端。

在下圖中,Proseware Gizmo 裝置節點有一個裝置堆疊,其中包含三個(裝置對象、驅動程式)組。 頂端裝置對象與驅動程式 AfterThought.sys相關聯、中間裝置對象與驅動程式 Proseware.sys相關聯,而底部裝置對象與驅動程式 Pci.sys相關聯。 圖表中央的PCI總線節點有一個裝置堆疊,其中包含兩個(裝置物件、驅動程式)配對--與 Pci.sys 相關聯的裝置物件和與 Acpi.sys相關聯的裝置物件。

圖表顯示 Proseware gizmo 和 PCI 裝置節點中裝置堆疊內排序的裝置物件。

如何建構裝置堆疊?

在啟動期間,PnP 管理員會要求驅動程式為每個總線列舉連線到總線的子裝置。 例如,PnP 管理員會要求PCI總線驅動程式 (Pci.sys) 列舉連接到PCI總線的裝置。 為了回應此要求,Pci.sys 為每個連線到PCI總線的裝置建立裝置物件。 每個裝置對象稱為 實體裝置物件 (PDO)。 Pci.sys 建立一組 PDO 之後,裝置樹狀結構看起來就像下圖所示。

關於子裝置的 PCI 節點和實體設備物件的圖表。

PnP 管理員會將裝置節點與每個新建立的 PDO 產生關聯,並在登錄中尋找,以判斷哪些驅動程式必須是節點裝置堆疊的一部分。 裝置堆疊必須有一個(且只有一個)功能驅動程式,並且可以選擇性地包含一個或多個 篩選驅動程式。 函式驅動程式是裝置堆疊的主要驅動程式,負責處理讀取、寫入和裝置控制要求。 篩選驅動程式會在處理讀取、寫入和裝置控制要求時扮演輔助角色。 載入每個函式和篩選驅動程式時,它會建立裝置物件,並將本身附加至裝置堆疊。 函式驅動程式所建立的裝置對象稱為 功能裝置物件(FDO),而篩選驅動程式所建立的裝置對象稱為 篩選裝置物件(Filter DO)。 現在裝置樹狀結構看起來像下圖。

顯示 Proseware gizmo 裝置節點中篩選器、函式與實體裝置物件的裝置樹狀結構圖。

在圖表中,請注意,在一個節點中,篩選驅動程式高於函式驅動程式,而在其他節點中,篩選驅動程式位於函式驅動程式下方。 在裝置堆疊中,位於函式驅動程式上方的驅動程式稱為 上層篩選驅動程式。 函式驅動程式下方的篩選驅動程式稱為 較低的篩選驅動程式

PDO 一律是裝置堆疊中的底部裝置物件。 這是由於裝置堆疊的建構方式所導致的。 PDO 會先建立,而且當其他裝置對象連結至堆疊時,它們會連結至現有堆疊的頂端。

注意 安裝裝置的驅動程式時,安裝程式會使用資訊 (INF) 檔案中的資訊來判斷哪個驅動程式是函式驅動程式,以及哪些驅動程式是篩選條件。 一般而言,INF 檔案是由Microsoft或硬體廠商提供。 安裝裝置的驅動程序之後,PnP 管理員可以藉由查看登錄來判斷裝置的函式和篩選驅動程式。

巴士司機

在上圖中,您可以看到驅動程式 Pci.sys 扮演兩個角色。 首先,Pci.sys 與PCI總線裝置節點中的FDO相關聯。 事實上,它會在PCI總線裝置節點中建立 FDO。 因此,Pci.sys 是PCI總線的功能驅動程式。 其次,Pci.sys 與PCI總線節點每個子系中的 PDO 相關聯。 請記住,它為子裝置建立了多個 PDO。 為裝置節點建立 PDO 的驅動程式,稱為該節點的 總線驅動程式

如果您的參考點是PCI總線,則 Pci.sys 是函式驅動程式。 但是,如果你的參考點是 Proseware Gizmo 裝置,那麼 Pci.sys 是總線驅動程序。 這種雙重角色在 PnP 裝置樹狀結構中很常見。 作為總線功能驅動的驅動程式,也同時作為總線子裝置的總線驅動。

使用者模式裝置堆疊

到目前為止,我們一直在討論核心模式裝置堆疊。 也就是說,堆疊中的驅動程式會以核心模式執行,而裝置對象會對應至系統空間,這是只能在核心模式中執行之程式代碼的位址空間。 如需核心模式與使用者模式差異的詳細資訊,請參閱 使用者模式和核心模式

在某些情況下,裝置除了核心模式裝置堆疊之外,還有使用者模式裝置堆疊。 使用者模式驅動程式通常以 User-Mode Driver Framework (UMDF)為基礎,這是 Windows 驅動程序架構 (WDF)所提供的驅動程式模型之一。 在UMDF中,驅動程式是使用者模式 DLL,而裝置對像是實作 IWDFDevice 介面的 COM 物件。 UMDF 裝置堆疊中的裝置對象稱為 WDF 裝置物件 (WDF DO)。

下圖顯示 USB-FX-2 裝置的裝置節點、內核模式裝置堆疊和使用者模式裝置堆疊。 使用者模式和內核模式堆疊中的驅動程式都會參與導向 USB-FX-2 裝置的 I/O 要求。

顯示使用者模式和內核模式裝置堆疊的圖表。

所有驅動程式開發人員 概念

驅動程式堆疊


其他資源