Introduktion till styrenhetsobjekt

Som namnet antyder representerar ett kontrollantobjekt vanligtvis en fysisk enhetsstyrenhet med anslutna enheter. En icke-WDM-drivrutin på lägsta nivå för en uppsättning liknande enheter som samordnas av en fysisk styrenhet kan skapa ett kontrollantobjekt och använda det för att synkronisera I/O-åtgärder mellan de anslutna enheterna. Drivrutinen implementerar en ControllerControl- rutin och anropar I/O-hanterarens stödrutiner för kontrollerobjekt.

Anmärkning

Användning av kontrollantobjekt stöds inte i WDM-drivrutiner.

I allmänhet använder drivrutiner styrenhetsobjekt för att synkronisera åtgärder till anslutna enheter om följande villkor gäller:

  • Styrenheten utför inte långa åtgärder utan att avbryta, så drivrutinen behöver inte skapa en enhetsdedikerad tråd eller använda systemarbetaretrådar.

  • Enheterna som är anslutna till styrenheten liknar varandra. Det vill: de är inte enheter med helt olika fysiska egenskaper eller driftfunktioner, till exempel tangentbords- och musenheter som kan anslutas till tangentbordet och den extra enhetsstyrenheten.

  • Drivrutinen är utformad för att vara monolitisk: enkelskiktad i förhållande till enhetsstyrenheten och anslutna fysiska enheter, i stället för att utformas som en portdrivrutin (för styrenheten) med en eller flera klassdrivrutiner (för anslutna enheter) skiktade över portdrivrutinen.

Drivrutiner för enheter med I/O-kanaler och en uppsättning logiska enhetsobjekt kan också använda ett kontrollantobjekt för att synkronisera sina I/O-åtgärder mellan eller mellan kanalerna för en sådan enhet.

Ett kontrollantobjekt har inget namn och är därför inte målet för I/O-begäranden. Det är helt enkelt en synkroniseringsmekanism för att serialisera I/O från en uppsättning enhetsobjekt. Eftersom ett kontrollantobjekt inte har något namn är det osynligt för skyddade undersystem i användarläge, vilket inte kan göra enhets-I/O-begäranden utan att få ett handtag för filobjektet som representerar målenhetsobjektet. Ett kontrollantobjekt är också osynligt för drivrutiner på högre nivå, som inte kan koppla sina egna enhetsobjekt till ett kontrollantobjekt. Med andra ord kan varken I/O-chefen eller en drivrutin på högre nivå konfigurera en IRP som begär I/O på en enhet som representeras av ett kontrollantobjekt. I/O-begäranden utfärdas alltid till enhetsobjekt. Endast föraren kan använda kontrollantobjektet.

Synkronisering och överlappande I/O

Monolitiska drivrutiner för fysiska enheter med funktioner som "AT"-diskkontrollanten behöver inte använda ett kontrollantobjekt för att synkronisera sina enhets-I/O-åtgärder. En drivrutinsskrivare kan till exempel prova något som liknar följande synkroniseringsteknik i stället för att använda ett kontrollantobjekt:

  • Konfigurera namngivna enhetsobjekt för att representera de enheter som är mål för I/O-begäranden.

  • Bibehåll tillståndsinformation (kanske en uppsättning Device Busy-flaggor i varje enhetstillägg eller i ett enda enhetstillägg) som anger vilket enhetsobjekt som är målet för den aktuella I/O-åtgärden.

  • Utför in-/utdataoperationer för det enhetsobjekt som för närvarande är upptaget och köa om inkommande IRP:er för andra enhetsobjekt tills den aktuella IRP:n har slutförts.

Den föregående synkroniseringstekniken serialiserar IRP-bearbetning för alla drivrutins målenhetsobjekt. Observera att det också tvingar drivrutinen att slutföra den aktuella IRP:en innan den StartIo- rutin kan börja bearbeta nästa IRP, vilket tyvärr minskar drivrutinsprestandan.

Om vissa enhetsåtgärder kan överlappas kan användning av ett kontrollantobjekt öka drivrutins I/O-dataflöde, eftersom den här synkroniseringstekniken gör att drivrutinen kan avgöra om den kan överlappa åtgärder precis innan den konfigurerar den fysiska enheten. Till exempel kan en diskkontroller tillåta att drivrutinen överlappar sökningar på en disk med läs-/skrivåtgärder på en annan disk.

Att använda ett kontrollantobjekt är dessutom ett relativt enkelt sätt att synkronisera I/O-åtgärder för fler än ett målenhetsobjekt via en enda fysisk enhet, till exempel en "AT"-diskkontrollant. Med ett kontrollerobjekt kan en monolitisk drivrutin synkronisera I/O-åtgärder över en uppsättning namngivna enhetsobjekt utan att behöva hålla reda på tillståndet för varje enhet och enhetskontrollanten i ett eller flera enhetstillägg, och utan att behöva köa om IRP:er.

Vissa enheter som är utformade för att överlappa I/O-åtgärder, till exempel full-duplex seriekontrollers eller bus-masteradaptrar, har dock vanligtvis drivrutiner som konfigurerar interna köer för IRP:er.