Delen via


Apparaatknooppunten en apparaatstacks

In Windows worden apparaten vertegenwoordigd door apparaatknooppunten in de PnP-apparaatstructuur (Plug and Play). Wanneer een I/O-aanvraag doorgaans naar een apparaat wordt verzonden, helpen verschillende stuurprogramma's de aanvraag af te handelen. Elk van deze stuurprogramma's is gekoppeld aan een apparaatobject en de apparaatobjecten worden in een stack gerangschikt. De volgorde van apparaatobjecten samen met de bijbehorende stuurprogramma's wordt een apparaatstack genoemd. Elk apparaatknooppunt heeft een eigen apparaatstack.

Apparaatknooppunten en de Plug en Play-apparaatstructuur

Windows organiseert apparaten in een boomstructuur met de naam Plug and Play-apparaatstructuur, of gewoon de apparaatstructuur. Normaal gesproken vertegenwoordigt een knooppunt in de apparaatstructuur een apparaat of een afzonderlijke functie op een samengesteld apparaat. Sommige knooppunten vertegenwoordigen echter softwareonderdelen die geen koppeling hebben met fysieke apparaten.

Een knooppunt in de apparaatstructuur wordt een apparaatknooppuntgenoemd. De hoofdnode van de apparaatboom wordt de root device nodegenoemd. Conventioneel wordt het hoofdknooppunt van het apparaat onderaan de apparaatstructuur getekend, zoals te zien is in het volgende diagram.

diagram van de apparaatstructuur, met apparaatknooppunten.

De apparaatstructuur illustreert de ouder/kind-relaties die inherent zijn aan de PnP-omgeving. Verschillende knooppunten in de apparaatstructuur vertegenwoordigen bussen waaraan onderliggende apparaten zijn verbonden. Het PCI Bus-knooppunt vertegenwoordigt bijvoorbeeld de fysieke PCI-bus op het moederbord. Tijdens het opstarten vraagt de PnP-manager het PCI-busstuurprogramma om de apparaten op te sommen die zijn verbonden met de PCI-bus. Deze apparaten worden weergegeven door kindknooppunten van de PCI Bus node. In het voorgaande diagram bevat het PCI Bus-knooppunt onderliggende knooppunten voor verschillende apparaten die zijn verbonden met de PCI-bus, waaronder USB-hostcontrollers, een audiocontroller en een PCI Express-poort.

Sommige apparaten die zijn verbonden met de PCI-bus zijn bussen zelf. De PnP-manager vraagt elk van deze bussen om de apparaten op te sommen die ermee zijn verbonden. In het voorgaande diagram zien we dat de audiocontroller een bus is waarop een audioapparaat is aangesloten. We kunnen zien dat de PCI Express-poort een bus is waarop een beeldschermadapter is aangesloten en dat de beeldschermadapter een bus is waarop één monitor is aangesloten.

Of u nu denkt aan een knooppunt dat een apparaat of bus vertegenwoordigt, is afhankelijk van uw standpunt. U kunt bijvoorbeeld de beeldschermadapter beschouwen als een apparaat dat een belangrijke rol speelt bij het voorbereiden van frames die op het scherm worden weergegeven. U kunt echter ook de beeldschermadapter beschouwen als een bus die aangesloten beeldschermen kan detecteren en inventariseren.

Apparaatobjecten en apparaatstacks

Een apparaatobject is een exemplaar van een DEVICE_OBJECT structuur. Elk apparaatknooppunt in de PnP-apparaatstructuur heeft een geordende lijst met apparaatobjecten en elk van deze apparaatobjecten is gekoppeld aan een stuurprogramma. De geordende lijst met apparaatobjecten, samen met de bijbehorende stuurprogramma's, wordt de apparaatstack genoemd voor het apparaatknooppunt.

U kunt een apparaatstack op verschillende manieren beschouwen. In de meest formele zin is een apparaatstack een geordende lijst met paren (apparaatobject, stuurprogramma). In bepaalde contexten kan het echter handig zijn om de apparaatstack te beschouwen als een geordende lijst met apparaatobjecten. In andere contexten kan het handig zijn om de apparaatstack te beschouwen als een geordende lijst met stuurprogramma's.

Volgens de conventie heeft een apparaatstack een boven- en onderzijde. Het eerste apparaatobject dat in de apparaatstack moet worden gemaakt, bevindt zich onderaan en het laatste apparaatobject dat moet worden gemaakt en gekoppeld aan de apparaatstack bevindt zich bovenaan.

In het volgende diagram heeft het knooppunt Proseware Gizmo een apparaatstack met drie koppels van apparaatobjecten en stuurprogramma's. Het bovenste apparaatobject is gekoppeld aan het stuurprogramma AfterThought.sys, het middelste apparaatobject is gekoppeld aan het stuurprogramma Proseware.sysen het onderste apparaatobject is gekoppeld aan het stuurprogramma Pci.sys. Het PCI Bus-knooppunt in het midden van het diagram heeft een apparaatstack die twee paren (apparaatobject, stuurprogramma) bevat: een apparaatobject dat is gekoppeld aan Pci.sys en een apparaatobject dat is gekoppeld aan Acpi.sys.

diagram met apparaatobjecten die zijn geordend in apparaatstacks in de proseware-gizmo- en pci-apparaatknooppunten.

Hoe wordt een apparaatstack opgebouwd?

Tijdens het opstarten vraagt de PnP-manager het stuurprogramma voor elke bus om ondergeschikte apparaten die zijn verbonden met de bus op te sommen. De PnP-manager vraagt bijvoorbeeld het PCI-stuurprogramma (Pci.sys) om de apparaten die verbonden zijn met de PCI-bus op te sommen. Als reactie op deze aanvraag maakt Pci.sys een apparaatobject voor elk apparaat dat is verbonden met de PCI-bus. Elk van deze apparaatobjecten wordt een fysiek apparaatobject (PDO) genoemd. Kort nadat Pci.sys de set PDO's heeft gemaakt, ziet de apparaatboom eruit zoals in het volgende diagram.

diagram van pci-knooppunten en fysieke apparaatobjecten voor onderliggende apparaten.

De PnP-manager koppelt een apparaatknooppunt aan elke zojuist gemaakte PDO en zoekt in het register om te bepalen welke stuurprogramma's deel moeten uitmaken van de apparaatstack voor het knooppunt. De apparaatstack moet één (en slechts één) functiestuurprogramma hebben en kan desgewenst een of meer filterstuurprogramma'shebben. Het functiestuurprogramma is het belangrijkste stuurprogramma voor de apparaatstack en is verantwoordelijk voor het verwerken van lees-, schrijf- en apparaatbeheeraanvragen. Filterstuurprogramma's spelen hulprollen bij het verwerken van lees-, schrijf- en apparaatbeheeraanvragen. Wanneer elk functie- en filterstuurprogramma wordt geladen, wordt er een apparaatobject aangemaakt en gekoppeld aan de apparaatstack. Een apparaatobject dat door het functiestuurprogramma is gemaakt, wordt een functioneel apparaatobject (FDO) genoemd en een apparaatobject dat door een filterstuurprogramma is gemaakt, wordt een apparaatobject (Filter DO) genoemd. De apparaatstructuur ziet er nu ongeveer als volgt uit.

diagram van een apparaatstructuur met daarin de filter-, functie- en fysieke apparaatobjecten in het knooppunt van het proseware gizmo-apparaat.

In het diagram ziet u dat in het ene knooppunt het filterstuurprogramma boven het functiestuurprogramma ligt en in het andere knooppunt het filterstuurprogramma zich onder het functiestuurprogramma bevindt. Een filterstuurprogramma dat zich boven het functiestuurprogramma in een apparaatstack bevindt, wordt een bovenste filterstuurprogrammagenoemd. Een filterstuurprogramma dat zich onder het functiestuurprogramma bevindt, wordt een lager filterstuurprogrammagenoemd.

De PDO is altijd het onderste apparaatobject in een apparaatstack. Dit komt door de manier waarop een apparaatstack wordt samengesteld. De PDO wordt eerst gemaakt en omdat er extra apparaatobjecten aan de stack zijn gekoppeld, worden ze aan de bovenkant van de bestaande stack gekoppeld.

Opmerking Wanneer de stuurprogramma's voor een apparaat zijn geïnstalleerd, gebruikt het installatieprogramma informatie in een informatiebestand (INF) om te bepalen welk stuurprogramma het functiestuurprogramma is en welke stuurprogramma's filters zijn. Doorgaans wordt het INF-bestand geleverd door Microsoft of door de hardwareleverancier. Nadat de stuurprogramma's voor een apparaat zijn geïnstalleerd, kan de PnP-manager de functie bepalen en stuurprogramma's voor het apparaat filteren door in het register te zoeken.

Buschauffeurs

In het voorgaande diagram ziet u dat het stuurprogramma Pci.sys twee rollen speelt. Eerst wordt Pci.sys gekoppeld aan de FDO in het PCI Bus-apparaatknooppunt. De FDO werd namelijk binnen het PCI Bus-apparaatknooppunt gecreëerd. Dus Pci.sys is het functiestuurprogramma voor de PCI-bus. Ten tweede is Pci.sys gekoppeld aan de PDO in elk subelement van het PCI Bus-knooppunt. Herinner u dat het de PPO's voor de kinderapparaten heeft gemaakt. Het stuurprogramma dat de PDO voor een apparaatknooppunt maakt, wordt het busstuurprogramma voor het knooppunt genoemd.

Als uw referentiepunt de PCI-bus is, Pci.sys het functiestuurprogramma is. Maar als uw referentiepunt het Proseware Gizmo-apparaat is, Pci.sys is de buschauffeur. Deze dubbele rol is gebruikelijk in de PnP-apparaatstructuur. Een chauffeur die fungeert als functiechauffeur voor een bus dient ook als buschauffeur voor een onderliggend apparaat van de bus.

Apparaatstacks in de gebruikersmodus

Tot nu toe hebben we gesproken over de kernel-mode device stacks. Dat wil gezegd: de stuurprogramma's in de stacks worden uitgevoerd in de kernelmodus en de apparaatobjecten worden toegewezen aan systeemruimte. Dit is de adresruimte die alleen beschikbaar is voor code die wordt uitgevoerd in de kernelmodus. Zie Gebruikersmodus en kernelmodusvoor meer informatie over het verschil tussen de kernelmodus en de gebruikersmodus.

In sommige gevallen heeft een apparaat een apparaatstapel in de gebruikersmodus naast de kernelmodusapparaatstapel. Stuurprogramma's in de gebruikersmodus zijn vaak gebaseerd op het User-Mode Driver Framework (UMDF), een van de stuurprogrammamodellen die worden geleverd door de WDF-(Windows Driver Frameworks). In UMDF zijn de stuurprogramma's gebruikersmodus-DLL's en zijn de apparaatobjecten COM-objecten die de IWDFDevice-interface implementeren. Een apparaatobject in een UMDF-apparaatstack wordt een WDF-apparaatobject (WDF DO) genoemd.

In het volgende diagram ziet u het apparaatknooppunt, de kernelmodusapparaatstack en de gebruikersmodusapparaatstack voor een USB-FX-2-apparaat. De stuurprogramma's in zowel de gebruikersmodus- als kernelmodusstacks nemen deel aan I/O-aanvragen die zijn gericht op het USB-FX-2-apparaat.

diagram met apparaatstacks in de gebruikersmodus en kernelmodus.

Concepten voor alle ontwikkelaars van stuurprogramma's

Bestuurderstacks