Dela via


Använda Packet-Based Bus-Master DMA

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.