Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
För att använda paketbaserad DMA anropar drivrutiner till bus-master DMA-enheter följande sekvens av stödrutiner när de hanterar en IRP som kräver en DMA-överföring.
KeFlushIoBuffers precis innan du försöker allokera mappningsregister för en överföringsbegäran (mer information finns i Underhålla cachesammanhållning)
AllokeraAdapterChannel när drivrutinen är redo att programmera bussmästaranpassaren för DMA
MmGetMdlVirtualAddress för att hämta ett index till MDL, som krävs som en första parameter till MapTransfer, och MapTransfer för att göra systemets fysiska minne som backar upp IRP:ns buffertenhetstillgänglighet
Observera att alla drivrutiner kan behöva utföra mer än en överföringsåtgärd för att uppfylla den aktuella IRP:en, enligt beskrivningen i Dela upp överföringsbegäranden. Drivrutiner för enheter som inte har funktioner för punkt-/insamling kan anropa MapTransfer en gång per överföringsåtgärd. Drivrutiner för enheter som har funktioner för punkt-/insamling kan anropa MapTransfer mer än en gång för att konfigurera varje överföringsåtgärd. Alternativt kan dessa drivrutiner använda systemets inbyggda stöd för punkt-/insamling, som beskrivs i Använda punkt-/insamlings-DMA.
FlushAdapterBuffers i slutet av varje DMA-överföring till/från målenheten för att avgöra om alla begärda data har överförts helt
FreeMapRegisters så snart alla DMA-åtgärder för den aktuella IRP:n har slutförts, eftersom all datamängd har överförts helt eller på grund av att drivrutinen måste underkänna IRP:n på grund av ett enhets- eller buss-I/O-fel.
Adapterobjektpekaren som returneras av IoGetDmaAdapter är en obligatorisk parameter för AllokeraAdapterChannel, MapTransfer, FlushAdapterBuffers och FreeMapRegisters. Observera att i versioner av Windows NT före Windows 2000 kan bus-master-enheter skicka en NULL-adapterobjektpekare till MapTransfer och FlushAdapterBuffers. I Windows 2000 och senare kan drivrutiner inte längre göra det.
KeFlushIoBuffers och MmGetMdlVirtualAddress kräver en pekare till MDL på Irp-MdlAddress>.
Enskilda drivrutiner anropar den här sekvensen av supportrutiner vid olika tidpunkter, beroende på hur varje drivrutin implementeras för att betjäna enheten. Till exempel kan en drivrutins StartIo-rutin göra anropet till AllocateAdapterChannel, medan en annan drivrutin kan göra det här anropet från en rutin som tar bort IRP:er från en drivrutinsskapad sammankopplad kö eller enhetskö.
I stället för att använda de rutiner som beskrivs i det här avsnittet kan alla drivrutiner som använder paketbaserad DMA använda supportrutiner som är avsedda att effektivisera punkt-/insamlings-DMA, oavsett om enheten har inbyggt stöd för punkt-/insamling. Se Använda Scatter/Gather-DMA för detaljer.