Drivrutinsstackar
De flesta begäranden som skickas till enhetsdrivrutiner paketeras i I/O-begärandepaket (IRP:er). Varje enhet representeras av en enhetsnod och varje enhetsnod har en enhetsstack. Mer information finns i Enhetsnoder och enhetsstackar. Om du vill skicka en läs-, skriv- eller kontrollbegäran till en enhet letar I/O-hanteraren upp enhetens nod och skickar sedan en IRP till enhetsstacken för den noden. Ibland är mer än en enhetsstack involverad i bearbetningen av en I/O-begäran. Oavsett hur många enhetsstackar som ingår kallas den övergripande sekvensen med drivrutiner som deltar i en I/O-begäran drivrutinsstacken för begäran. Vi använder också termen drivrutinsstacken för att referera till den skiktade uppsättningen drivrutiner för en viss teknik.
I/O-begäranden som bearbetas av flera enhetsstackar
I vissa fall är mer än en enhetsstack involverad i bearbetningen av en IRP. Följande diagram illustrerar ett fall där fyra enhetsstackar ingår i bearbetningen av en enda IRP.
Så här bearbetas IRP i varje numrerad fas i diagrammet:
IRP skapas av Disk.sys, som är funktionsdrivrutinen i enhetsstacken för noden Min USB-lagringsenhet. Disk.sys skickar IRP ned enhetsstacken till Usbstor.sys.
Observera att Usbstor.sys är PDO-drivrutinen för noden Min USB-lagringsenhet och FDO-drivrutinen för noden USB-masslagringsenhet. I det här läget är det inte viktigt att avgöra om IRP ägs av (PDO, Usbstor.sys) eller (FDO, Usbstor.sys) paret. IRP ägs av drivrutinen, Usbstor.sys, och drivrutinen har åtkomst till både PDO och FDO.
När Usbstor.sys har slutfört bearbetningen av IRP skickar den IRP till Usbhub.sys. Usbhub.sys är PDO-drivrutinen för USB Mass Storage Device-noden och FDO-drivrutinen för USB Root Hub-noden. Det är inte viktigt att avgöra om IRP ägs av (PDO, Usbhub.sys) eller (FDO, Usbhub.sys) paret. IRP ägs av drivrutinen, Usbhub.sys, och drivrutinen har åtkomst till både PDO och FDO.
När Usbhub.sys har slutfört bearbetningen av IRP skickar den IRP till paret (Usbuhci.sys, Usbport.sys).
Usbuhci.sys är en miniportdrivrutin och Usbport.sys är en portdrivrutin. Paret (miniport, port) fungerar som en enda drivrutin. I det här fallet skrivs både miniportdrivrutinen och portdrivrutinen av Microsoft. Paret (Usbuhci.sys, Usbport.sys) är PDO-drivrutinen för noden USB Root Hub, och paret (Usbuhci.sys, Usbport.sys) är också FDO-drivrutinen för noden USB-hostkontrollern. Paret (Usbuhci.sys, Usbport.sys) gör den faktiska kommunikationen med värdstyrenhetens maskinvara, som i sin tur kommunicerar med den fysiska USB-lagringsenheten.
Drivrutinsstacken för en I/O-begäran
Överväg sekvensen med fyra drivrutiner som deltog i I/O-begäran som illustreras i föregående diagram. Vi kan få en annan vy av sekvensen genom att fokusera på drivrutinerna i stället för på enhetsnoderna och deras enskilda enhetsstackar. Följande diagram visar faktorerna i ordning från högst upp till längst ned. Observera att Disk.sys är associerad med ett enhetsobjekt, men var och en av de andra tre drivrutinerna är associerade med två enhetsobjekt.
Sekvensen med drivrutiner som deltar i en I/O-begäran kallas drivrutinsstacken för I/O-begäran. För att illustrera en drivrutinsstack av en I/O-begäran ritar vi drivrutinerna uppifrån till ned i den ordning de deltar i begäran.
Observera att drivrutinsstacken för en I/O-begäran skiljer sig helt från enhetsstacken för en enhetsnod. Observera också att drivrutinsstacken för en I/O-begäran inte nödvändigtvis finns kvar i en gren av enhetsträdet.
Teknikdrivrutinsstackar
Överväg drivrutinsstacken för I/O-begäran som visas i föregående diagram. Om vi ger var och en av drivrutinerna ett eget namn och gör några små ändringar i diagrammet har vi ett blockdiagram som liknar många av dem som visas i WDK-dokumentationen (Windows Driver Kit).
I diagrammet är drivrutinsstacken uppdelad i tre avsnitt. Vi kan tänka oss att varje avsnitt tillhör en viss teknik eller en viss komponent eller del av operativsystemet. Vi kan till exempel säga att det första avsnittet högst upp i drivrutinsstacken tillhör Volume Manager, det andra avsnittet tillhör operativsystemets lagringskomponent och det tredje avsnittet tillhör den centrala USB-delen av operativsystemet.
Tänk på faktorerna i det tredje avsnittet. Dessa drivrutiner är en delmängd av en större uppsättning usb-kärndrivrutiner som Microsoft tillhandahåller för hantering av olika typer av USB-begäranden och USB-maskinvara. Följande diagram visar hur hela USB-kärnblocksdiagrammet kan se ut.
Ett blockdiagram som visar alla drivrutiner för en viss teknik eller en viss komponent eller del av operativsystemet kallas för en teknikdrivrutinsstacken. Vanligtvis ges teknikdrivrutinsstackar namn som USB Core Driver Stack, Storage Stack, 1394 Driver Stack och Audio Driver Stack.
Note: Usb Core Block-diagrammet i den här artikeln visar ett av flera möjliga sätt att illustrera teknikdrivrutinsstackarna för USB 1.0 och 2.0. De officiella diagrammen för USB 1.0-, 2.0- och 3.0-drivrutinsstacken finns i USB-drivrutinsstackens arkitektur.