Freigeben über


Geräteknoten und Gerätestapel

In Windows werden Geräte durch Geräteknoten in der Plug & Play (PnP)-Gerätestruktur dargestellt. Wenn eine E/A-Anforderung an ein Gerät gesendet wird, helfen in der Regel mehrere Treiber bei der Behandlung der Anforderung. Jeder dieser Treiber ist einem Geräteobjekt zugeordnet, und die Geräteobjekte werden in einem Stapel angeordnet. Die Abfolge von Geräteobjekten zusammen mit den zugehörigen Treibern wird als Gerätestapel bezeichnet. Jeder Geräteknoten verfügt über einen eigenen Gerätestapel.

Geräteknoten und die Plug & Play Gerätestruktur

Windows organisiert Geräte in einer Struktur, die als Plug & Play Gerätestruktur bezeichnet wird, oder einfach die Gerätestruktur. In der Regel stellt ein Knoten in der Gerätestruktur entweder ein Gerät oder eine einzelne Funktion auf einem zusammengesetzten Gerät dar. Einige Knoten stellen jedoch Softwarekomponenten dar, die keine Zuordnung zu physischen Geräten aufweisen.

Ein Knoten in der Gerätestruktur wird als Geräteknoten bezeichnet. Der Stammknoten der Gerätestruktur wird als Stammgerätknoten bezeichnet. Standardmäßig wird der Stammgeräteknoten am unteren Rand der Gerätestruktur gezeichnet, wie im folgenden Diagramm dargestellt.

Diagramm der Gerätestruktur mit Geräteknoten.

Die Gerätestruktur veranschaulicht die Beziehungen zwischen übergeordneten und untergeordneten Elementen, die in der PnP-Umgebung vorhanden sind. Mehrere der Knoten in der Gerätestruktur stellen Busse dar, die über untergeordnete Geräte verfügen, die mit ihnen verbunden sind. Beispielsweise stellt der PCI-Busknoten den physischen PCI-Bus auf der Hauptplatine dar. Während des Starts fordert der PnP-Manager den PCI-Bustreiber auf, die mit dem PCI-Bus verbundenen Geräte aufgezählt zu werden. Diese Geräte werden durch untergeordnete Knoten des PCI-Busknotens dargestellt. Im vorherigen Diagramm verfügt der PCI-Busknoten über untergeordnete Knoten für mehrere Geräte, die mit dem PCI-Bus verbunden sind, einschließlich USB-Hostcontrollern, einem Audiocontroller und einem PCI Express-Anschluss.

Einige der mit dem PCI-Bus verbundenen Geräte sind Busse selbst. Der PnP-Manager fordert jeden dieser Busse auf, die damit verbundenen Geräte auflisten zu müssen. Im vorherigen Diagramm können wir sehen, dass der Audiocontroller ein Bus ist, der über ein audiogerät angeschlossen ist. Wir können sehen, dass der PCI Express-Port ein Bus ist, der einen Displayadapter angeschlossen hat, und der Grafikkarte ist ein Bus, der einen Monitor angeschlossen hat.

Ob Sie sich einen Knoten als Darstellung eines Geräts oder eines Buss vorstellen, hängt von Ihrem Standpunkt ab. Sie können sich beispielsweise den Displayadapter als Gerät vorstellen, das eine wichtige Rolle bei der Vorbereitung von Frames spielt, die auf dem Bildschirm angezeigt werden. Sie können sich jedoch auch den Displayadapter als Bus vorstellen, der angeschlossene Monitore erkennen und aufzählen kann.

Geräteobjekte und Gerätestapel

Ein Geräteobjekt ist eine Instanz einer DEVICE_OBJECT Struktur. Jeder Geräteknoten in der PnP-Gerätestruktur verfügt über eine sortierte Liste von Geräteobjekten, und jedes dieser Geräteobjekte ist einem Treiber zugeordnet. Die sortierte Liste der Geräteobjekte zusammen mit den zugehörigen Treibern wird als Gerätestapel für den Geräteknoten bezeichnet.

Sie können sich einen Gerätestapel auf verschiedene Arten vorstellen. Im formalsten Sinne ist ein Gerätestapel eine sortierte Liste von (Geräteobjekt, Treiber)-Paaren. In bestimmten Kontexten kann es jedoch sinnvoll sein, den Gerätestapel als eine sortierte Liste von Geräteobjekten zu betrachten. In anderen Kontexten kann es sinnvoll sein, den Gerätestapel als eine sortierte Liste von Treibern zu betrachten.

In der Konvention verfügt ein Gerätestapel über einen oberen und einen unteren Rand. Das erste Geräteobjekt, das im Gerätestapel erstellt werden soll, befindet sich unten, und das letzte zu erstellende und an den Gerätestapel angefügte Geräteobjekt befindet sich oben.

Im folgenden Diagramm verfügt der Proseware Gizmo-Geräteknoten über einen Gerätestapel, der drei (Geräteobjekt, Treiber)-Paare enthält. Das oberste Geräteobjekt ist dem Treiber AfterThought.sys zugeordnet, das mittlere Geräteobjekt dem Treiber Proseware.sys zugeordnet, und das untere Geräteobjekt ist dem Treiber Pci.sys zugeordnet. Der PCI-Busknoten in der Mitte des Diagramms weist einen Gerätestapel auf, der zwei (Geräteobjekt, Treiber)-Paare enthält– ein Geräteobjekt, das Pci.sys zugeordnet ist, und ein geräteobjekt, das Acpi.sys zugeordnet ist.

Diagramm mit Geräteobjekten, die in Gerätestapeln in den Proseware-Gizmo- und PCI-Geräteknoten angeordnet sind.

Wie wird ein Gerätestapel konstruiert?

Während des Starts fordert der PnP-Manager den Fahrer auf, für jeden Bus untergeordnete Geräte auflisten, die mit dem Bus verbunden sind. Beispielsweise fordert der PnP-Manager den PCI-Bustreiber (Pci.sys) auf, die mit dem PCI-Bus verbundenen Geräte aufzählen zu lassen. Als Reaktion auf diese Anforderung erstellt Pci.sys ein Geräteobjekt für jedes Gerät, das mit dem PCI-Bus verbunden ist. Jedes dieser Geräteobjekte wird als physisches Geräteobjekt (PDO) bezeichnet. Kurz nachdem Pci.sys den Satz von PDOs erstellt hat, sieht die Gerätestruktur wie im folgenden Diagramm dargestellt aus.

Diagramm von PCI-Knoten- und physischen Geräteobjekten für untergeordnete Geräte.

Der PnP-Manager ordnet jedem neu erstellten PDO einen Geräteknoten zu und sucht in der Registrierung, um zu ermitteln, welche Treiber Teil des Gerätestapels für den Knoten sein müssen. Der Gerätestapel muss über einen (und nur einen) Funktionstreiber verfügen und optional über einen oder mehrere Filtertreiber verfügen. Der Funktionstreiber ist der Haupttreiber für den Gerätestapel und ist für die Verarbeitung von Lese-, Schreib- und Gerätesteuerungsanforderungen verantwortlich. Filtertreiber spielen Hilfsrollen bei der Verarbeitung von Lese-, Schreib- und Gerätesteuerungsanforderungen. Da jeder Funktions- und Filtertreiber geladen wird, erstellt er ein Geräteobjekt und fügt sich selbst an den Gerätestapel an. Ein vom Funktionstreiber erstelltes Geräteobjekt wird als funktionales Geräteobjekt (FDO) bezeichnet, und ein von einem Filtertreiber erstelltes Geräteobjekt wird als Filtergeräteobjekt (Filter DO) bezeichnet. Nun sieht die Gerätestruktur ungefähr wie dieses Diagramm aus.

Diagramm einer Gerätestruktur, die die Filter-, Funktions- und physischen Geräteobjekte im Proseware-Gizmo-Geräteknoten zeigt.

Beachten Sie im Diagramm, dass sich der Filtertreiber in einem Knoten über dem Funktionstreiber befindet, und im anderen Knoten befindet sich der Filtertreiber unter dem Funktionstreiber. Ein Filtertreiber, der über dem Funktionstreiber in einem Gerätestapel liegt, wird als oberer Filtertreiber bezeichnet. Ein Filtertreiber, der sich unterhalb des Funktionstreibers befindet, wird als niedrigerer Filtertreiber bezeichnet.

Das PDO ist immer das untere Geräteobjekt in einem Gerätestapel. Dies ergibt sich aus der Konstruktion eines Gerätestapels. Die PDO wird zuerst erstellt, und wenn zusätzliche Geräteobjekte an den Stapel angefügt werden, werden sie am oberen Rand des vorhandenen Stapels angefügt.

Hinweis : Wenn die Treiber für ein Gerät installiert werden, verwendet das Installationsprogramm Informationen in einer Informationsdatei (INF), um zu bestimmen, welcher Treiber der Funktionstreiber ist und welche Treiber Filter sind. In der Regel wird die INF-Datei entweder von Microsoft oder vom Hardwareanbieter bereitgestellt. Nachdem die Treiber für ein Gerät installiert wurden, kann der PnP-Manager die Funktion und die Filtertreiber für das Gerät ermitteln, indem sie in der Registrierung suchen.

Busfahrer

Im vorherigen Diagramm können Sie sehen, dass der Treiber Pci.sys zwei Rollen spielt. Zunächst ist Pci.sys dem FDO im PCI Bus-Geräteknoten zugeordnet. Tatsächlich wurde der FDO im PCI Bus-Geräteknoten erstellt. Daher ist Pci.sys der Funktionstreiber für den PCI-Bus. Zweitens ist Pci.sys dem PDO in jedem untergeordneten Element des PCI-Busknotens zugeordnet. Erinnern Sie sich daran, dass sie die PDOs für die untergeordneten Geräte erstellt hat. Der Treiber, der den PDO für einen Geräteknoten erstellt, wird als Bustreiber für den Knoten bezeichnet.

Wenn ihr Bezugspunkt der PCI-Bus ist, ist Pci.sys der Funktionstreiber. Aber wenn Ihr Bezugspunkt das Proseware Gizmo-Gerät ist, dann ist Pci.sys der Busfahrer. Diese duale Rolle ist typisch für die PnP-Gerätestruktur. Ein Fahrer, der als Funktionstreiber für einen Bus dient, dient auch als Bustreiber für ein untergeordnetes Gerät des Busses.

Gerätestapel im Benutzermodus

Bisher haben wir uns mit Kernelmodus-Gerätestapeln befasst. Das heißt, die Treiber in den Stapeln werden im Kernelmodus ausgeführt, und die Geräteobjekte werden im Systembereich zugeordnet. Dies ist der Adressraum, der nur für Code verfügbar ist, der im Kernelmodus ausgeführt wird. Informationen zum Unterschied zwischen Kernelmodus und Benutzermodus finden Sie unter "Benutzermodus" und "Kernelmodus".

In einigen Fällen verfügt ein Gerät zusätzlich zum Kernelmodus-Gerätestapel über einen Gerätestapel im Benutzermodus. Benutzermodustreiber basieren häufig auf dem User-Mode Driver Framework (UMDF), einem der Treibermodelle, die von windows Driver Frameworks (WDF) bereitgestellt werden. In UMDF sind die Treiber DLLs im Benutzermodus, und die Geräteobjekte sind COM-Objekte, die die IWDFDevice-Schnittstelle implementieren. Ein Geräteobjekt in einem UMDF-Gerätestapel wird als WDF-Geräteobjekt (WDF DO) bezeichnet.

Das folgende Diagramm zeigt den Geräteknoten, den Kernelmodusgerätestapel und den Benutzermodusgerätestapel für ein USB-FX-2-Gerät. Die Treiber sowohl im Benutzermodus als auch im Kernelmodusstapel nehmen an E/A-Anforderungen teil, die an das USB-FX-2-Gerät gerichtet sind.

Diagramm mit Benutzermodus- und Kernelmodus-Gerätestapeln.

Konzepte für alle Treiberentwickler

Treiberstapel