Hämta ett adapterobjekt

Under start av enheten anropar en drivrutin som använder system- eller bussmaster-DMA IoGetDmaAdapter för att få en pekare till ett adapterobjekt och fastställa det maximala antalet kartregister som är tillgängliga för varje överföringsåtgärd. När en drivrutin anropar IoGetDmaAdapter, anropar I/O-hanteraren i sin tur HAL för att hämta nödvändig plattformsspecifik information.

En drivrutin måste ange viss information i en systemdefinierad DEVICE_DESCRIPTION struktur i sitt anrop till IoGetDmaAdapter. Drivrutiner måste använda RtlZeroMemory för att initiera DEVICE_DESCRIPTION-strukturen med nollor innan de anger värden i den.

Nödvändiga data inkluderar information om funktionerna i förarens enhet, till exempel om enheten är en busmaster, om den har scatter/gather-funktioner och hur många byte data enheten kan överföra åt gången (MaximumLength).

De nödvändiga enhetsbeskrivningsdata innehåller också plattformsspecifik information, till exempel det systemtilldelade och plattformsspecifika numret på bussen som en drivrutin för en bussmasterenhet kontrollerar. En drivrutin kan hämta den här informationen genom att anropa IoGetDeviceProperty.

Den DEVICE_DESCRIPTION strukturen innehåller vissa fält som kan vara irrelevanta för vissa DMA-enheter eller drivrutiner. Fältet BusNumber används till exempel inte i WDM-drivrutiner. Varje drivrutin bör ange värden för relevanta strukturmedlemmar och ange värdena för alla andra medlemmar till noll.

Drivrutinen för en underordnad enhet bör inte skicka TRUE i fältet ScatterGather, såvida inte enheten kan vänta på att systemets DMA-kontroller ska omprogrammeras när en begäran måste delas upp i två eller flera DMA-operationer.

IoGetDmaAdapter- returnerar både en pekare till ett adapterobjekt och ett plattformsspecifikt eller enhetsspecifikt värde som anger hur många kartregister som är tillgängliga med adapterobjektet för varje DMA-överföringsåtgärd.

Det returnerade adapterobjektet innehåller tre fält som är tillgängliga för drivrutiner:

  • Versionsnummer (version)

  • Storlek ()

  • Pekare till en DMA_OPERATIONS struktur (DmaOperations)

Den DMA_OPERATIONS-strukturen består av en tabell med pekare till funktionerna som drivrutinen måste använda för att utföra DMA-åtgärder på enheten. Funktionerna är endast tillgängliga via pekarna i den här datastrukturen. en drivrutin kan inte anropa dem direkt med namn. (Observera att dessa rutiner ersätter HalXxx rutiner som stöds i tidigare versioner av Windows NT. För att säkerställa kompatibilitet för äldre drivrutiner tillhandahåller Wdm.h- och Ntddk.h-huvudfilerna makron med de föråldrade namnen, men nya drivrutiner bör alltid anropa funktionerna via datastrukturen.)

Antalet kartregister kan variera från enhet till enhet och från plattform till plattform. I allmänhet tilldelar HAL ett antal kartregister enligt följande kriterier:

  • Om möjligt returnerar HAL ett värde som är ett fler än det antal kartregister som krävs för att överföra MaximumLength byte, enligt vad som anges i drivrutinsanropet till IoGetDmaAdapter.

  • Annars returnerar HAL ett mindre värde som är så stort som möjligt för den specifika plattformen.

Med andra ord ger HAL vanligtvis varje drivrutin tillräckligt med kartregister för att maximera DMA-dataflödet för enheten, men HAL kan returnera ett mindre värde på vissa Windows-plattformar. Det finns ingen garanti för att en drivrutin får det antal kartregister som begärs, så drivrutiner bör alltid kontrollera det returnerade värdet.

Alla drivrutiner för DMA-enheter måste tillhandahålla lagring för pekaren till adapterobjektet och värdet NumberOfMapRegisters som returneras av IoGetDmaAdapter. Den här pekaren är en obligatorisk parameter för de systemspecifika supportrutiner som används för DMA. Eftersom många av dessa stödrutiner måste anropas på IRQL = DISPATCH_LEVEL, måste den drivrutinsallokerade lagringen vara resident. De flesta DMA-drivrutiner tillhandahåller nödvändig lagring i ett enhetstillägg. Lagringen kan dock finnas i ett kontrollertillägg om drivrutinen också använder ett kontrollerobjekt eller i en icke-sidplacerad pool som allokeras av drivrutinen. Mer information finns i Allokera System-Space minne och Hantera maskinvaruprioriteringar.

När drivrutinen har slutfört alla DMA-åtgärder anropas PutDmaAdapter för att frigöra adapterobjektet.

Följande avsnitt Using System DMA och Using Bus-Master DMAbeskriver hur drivrutiner för monolitiska DMA-enheter använder supportrutiner för att tillfredsställa överföringsbegäranden. Dessa avsnitt förutsätter att föraren har följande:

  • En standardrutin StartIo i stället för att sätta upp och hantera en intern kö av IRP:er

  • En intern rutin för att dela upp överföringsbegäranden för vilka det inte finns tillräckligt med kartregister

  • Inga enhetsspecifika DMA-begränsningar

Med andra ord beskriver de här avsnitten den enklaste möjliga tekniken för drivrutinernas DMA-åtgärder, men enskilda drivrutiner använder inte nödvändigtvis exakt samma tekniker. För alla drivrutiner för en DMA-enhet, vilka drivrutinsrutiner som ska dela upp stora DMA-överföringsbegäranden beror på drivrutinsmodellen (klass/port eller monolitisk), på enhetens funktioner och på eventuella enhetsspecifika DMA-begränsningar som drivrutinen måste hantera.