torsdag 6. november 2008

I/O-systemet i Windows XP

I/O-systemet i Windows består av flere komponenter som sammen sørger for å håndtere maskinvare og tilerettelegge et grensesnitt slik at applikasjoner og systemet kan kommunisere med maskinvare. I/O-systemet er delt i 3 hoveddeler som er kontrollert av henholdvis I/O-manageren, PNP-manageren og Power manageren. Jeg skal nå gjennomgå hva hver enkelt av disse komponentene gjør.

I/O-Manageren.
I/O-manageren sørger for å definere et rammeverk hvor I/O-forespørslene kan dirigeres til sine respektive drivere som igjen kan håndtere forespørselen. I/O-trafikken blir håndtert pakkevis, og de aller fleste I/O-forespørsler er representert via en IRP (I/O Request Packet)-unntaket ligger altså i fast I/O som da altså ikke bruker IRP-pakker.
IRP-pakker blir generert av I/O-manageren og disse pakkene beskriver da altså en unik I/O operasjon. Deretter vil I/O-manageren gi en peker IRP-pakken til den korrekte driveren slik at den kan lese innholdet i IRP-pakken og utføre operasjonen som er beskrevet i pakken. Når denne operasjonen er ferdigstillt returnerer driveren IRP-pakken til I/O manageren slik at den kan enten fjerne pakken hvis I/O operasjonen er ferdig eller eventuellt sende pakken videre til neste driver for videre prosessering.

Flyten i en typisk I/O forespørsel:

1.Applikasjon i User-Mode kaller på en funksjon i Windows API-et som krever I/O overføring.

2.Denne funksjonen kaller da inn i I/O systemets service API som har funskjoner for forskjellige I/O operasjoner slik som å lese til en fil eller lese fra en fil.

3.Deretter vil I/O manageren finne ut hvilken driver som kan håndtere den forespurte I/O operasjonen og deretter overføre kontrollen til enhetsdrivreren.

4.Enhetsdriveren vil da be HAL om å utføre I/O opp mot maskinvaren hvor på HAL vil lese/skrive til de aktuelle I/O portene og registrene til maskinvaren.

Plug and Play-manageren. (PnP).
Plug and Play i Windows blir håndtert av PnP-manageren som da skal automatisk kjenne igjen maskinvare og kunne tilpasse seg endrende maskinvarekonfigurasjon. For at Plug and Play skal fungere skikkelig krever det at både maskinvare, drivere og operativsystemet er PnP-kompatibelt. PnP i Windows har følgende egenskaper.


  • PnP-manageren kjenner automatisk igjen installerte enheter og enumerer dem ved oppstart og vil også kunne detektere fjerning og installering av ny maskinvare mens systemet kjører
  • PnP-manageren vil automatisk allokere ressursene som er nødvendig for hver enkelt enhet (Avbrudd, I/O-minne, I/O registere eller buss-spesifikke ressurser.) Siden du kan legge til og fjerne maskinvare mens systemet kjører må også PnP manageren sørge for å kunne dynamisk endre ressurene for å tilfredstille de kravene som maskinvaren stiller.
  • PnP-manageren må også kunne laste inn korrekte drivere for den spesifikke enheten ved å sammenlinge spesifikasjonene på enhetene med de definert i driveren og deretter undersøke om driveren har egenskaper for å håndtere maskinvaren. Hvis driveren godkjennes vil PnP-manageren be I/O-mangeren om å laste den.

Power-manageren. Power-manageren håndterer strømtyring for systemet og for maskinvaren. For at dette skal fungere skikkelig må både maskinvare og BIOS samsvare med ACPI (Advanced Configuration and Power Interface)-standarden. Denne standarden spesifiser 6 forskejellige strømtilstander for systemet og 4 for maskinvaren. Systemets tilstander er definert gjennom S0 til S5 hvor S0 er fullstendig på og S5 er fullstendig av. Maskinvaren er definert gjennom D0 til D3 hvor D0 er fullstendig på og D3 er fullstendig av. Tilstandede imellom spesifiser strømsparingstilstander slik som hvile- og dvalemodus. Power manageren sørger for å styre systemet mens driverne sammarbeider med Power-manageren om å styre maskinvaren.

I/O-systemet via Windbg.

Du kan også bruke Windbg for å undersøke nærmere hvordan I/O-systemet oppererer. Du kan feks dumpe ut et trådobjekt og se på IRP-listen dens for å se IRP-pakker som ikke er ferdgistillt.


kd> !irp 822aa318
Irp is active with 1 stacks 1 is current (= 0x822aa388)
No Mdl: System buffer=82010c18: Thread 82284868: Irp stack trace.
cmd flg cl Device File Completion-Context
>[ e, 0] 5 0 82290a50 82302f90 00000000-00000000
\FileSystem\AvgMfx86
Args: 00000238 00000238 53492424 00000000


Vi kan dermed se at driveren som er ansvarlig for å håndtere denne pakken er AvgMfx86 og funksjoner den skal kjøre er definert som operasjon e.
Vi kan sjekke hvilken operasjon dette korresponderer til ved å bruke !drvobj opp mot driveren med en verbosity på 7:

kd> !drvobj AvgMfx86 7
Driver object (8224fbe0) is for:
\FileSystem\AvgMfx86
Driver Extension List: (id , addr)

Device Object list:
82290a50

DriverEntry: f88d1846 avgmfx86
DriverStartIo: 00000000
DriverUnload: f844ef08 fltmgr!FltpMiniFilterDriverUnload
AddDevice: 00000000

Dispatch routines:
[00] IRP_MJ_CREATE f88ce38e avgmfx86+0x38e
[01] IRP_MJ_CREATE_NAMED_PIPE 804fa87e nt!IopInvalidDeviceRequest
[02] IRP_MJ_CLOSE f88ce38e avgmfx86+0x38e
[03] IRP_MJ_READ 804fa87e nt!IopInvalidDeviceRequest
[04] IRP_MJ_WRITE 804fa87e nt!IopInvalidDeviceRequest
[05] IRP_MJ_QUERY_INFORMATION 804fa87e nt!IopInvalidDeviceRequest
[06] IRP_MJ_SET_INFORMATION 804fa87e nt!IopInvalidDeviceRequest
[07] IRP_MJ_QUERY_EA 804fa87e nt!IopInvalidDeviceRequest
[08] IRP_MJ_SET_EA 804fa87e nt!IopInvalidDeviceRequest
[09] IRP_MJ_FLUSH_BUFFERS 804fa87e nt!IopInvalidDeviceRequest
[0a] IRP_MJ_QUERY_VOLUME_INFORMATION 804fa87e nt!IopInvalidDeviceRequest
[0b] IRP_MJ_SET_VOLUME_INFORMATION 804fa87e nt!IopInvalidDeviceRequest
[0c] IRP_MJ_DIRECTORY_CONTROL 804fa87e nt!IopInvalidDeviceRequest
[0d] IRP_MJ_FILE_SYSTEM_CONTROL 804fa87e nt!IopInvalidDeviceRequest
[0e] IRP_MJ_DEVICE_CONTROL f88ce38e avgmfx86+0x38e
[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL 804fa87e nt!IopInvalidDeviceRequest
[10] IRP_MJ_SHUTDOWN 804fa87e nt!IopInvalidDeviceRequest
[11] IRP_MJ_LOCK_CONTROL 804fa87e nt!IopInvalidDeviceRequest
[12] IRP_MJ_CLEANUP 804fa87e nt!IopInvalidDeviceRequest
[13] IRP_MJ_CREATE_MAILSLOT 804fa87e nt!IopInvalidDeviceRequest
[14] IRP_MJ_QUERY_SECURITY 804fa87e nt!IopInvalidDeviceRequest
[15] IRP_MJ_SET_SECURITY 804fa87e nt!IopInvalidDeviceRequest
[16] IRP_MJ_POWER 804fa87e nt!IopInvalidDeviceRequest
[17] IRP_MJ_SYSTEM_CONTROL 804fa87e nt!IopInvalidDeviceRequest
[18] IRP_MJ_DEVICE_CHANGE 804fa87e nt!IopInvalidDeviceRequest
[19] IRP_MJ_QUERY_QUOTA 804fa87e nt!IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA 804fa87e nt!IopInvalidDeviceRequest
[1b] IRP_MJ_PNP 804fa87e nt!IopInvalidDeviceRequest

Vi kan se at operasjonen 0E korresponder til en intern funksjon i driveren. Vi kan også se standard rutinene som I/O-manageren definerer for driveren.

Vi kan også ta en titt på Strømfunksjonalitetene for systemet ved å bruke !pocaps

kd> !pocaps
PopCapabilities @ 0x80560d20
Misc Supported Features: PwrButton SlpButton Lid S3 S4 S5 HiberFile FullWake
Processor Features: Thermal Throttle (MinThrottle = 15%, Scale = 0%)
Disk Features: SpinDown
Battery Features: BatteriesPresent
Battery 0 - Capacity: 0 Granularity: 0
Battery 1 - Capacity: 0 Granularity: 0
Battery 2 - Capacity: 0 Granularity: 0
Wake Caps
Ac OnLine Wake: Sx
Soft Lid Wake: Sx
RTC Wake: S4
Min Device Wake: Sx
Default Wake: Sx

Det er del flere kommandoer som kan brukes, men HTML-genereringen til denne Javacript-teksteditoren er aldeles forferdelig så jeg tror jeg stopper her!
Håper dette var nyttig-om det er noen spørsmål om I/O-systemet eller andre ting med Windows så er det bare å spørre.


Ingen kommentarer: