Freigeben über


Verwenden von Packet-Based System-DMA

Treiber untergeordneter Geräte, die paketbasiertes DMA verwenden, rufen die folgende allgemeine Sequenz von Supportroutinen auf, wenn sie ein IRP verarbeiten, das eine DMA-Übertragung anfordert:

  • KeFlushIoBuffers kurz vor dem Versuch, den DMA-Controller des Systems zuzuweisen (weitere Informationen finden Sie unter Verwalten der Cachekohärenz).

  • AllocateAdapterChannel , wenn der Treiber bereit ist, sein Gerät für DMA zu programmieren und den DMA-Controller des Systems benötigt.

    AllocateAdapterChannel wiederum ruft die AdapterControl-Routine des Treibers auf.

  • MmGetMdlVirtualAddress zum Abrufen eines Indexes in die MDL, erforderlich als Parameter beim ersten Aufruf von MapTransfer

  • MapTransfer zum Programmieren des DMA-Systems für den Übertragungsvorgang

    Ein Treiber muss MapTransfer möglicherweise mehrmals aufrufen, um alle angeforderten Daten zu übertragen, wie unter Aufteilen von Übertragungsanforderungen erläutert.

  • FlushAdapterBuffers direkt nach jedem DMA-Übertragungsvorgang zum/vom untergeordneten Gerät

    Wenn ein Treiber MapTransfer mehr als einmal aufrufen muss, um alle angeforderten Daten zu übertragen, muss er FlushAdapterBuffers so oft aufrufen wie MapTransfer.

  • FreeAdapterChannel entweder, sobald alle angeforderten Daten übertragen wurden, oder wenn der Treiber die IRP aufgrund eines Geräte-E/A-Fehlers ausfällt

Der von IoGetDmaAdapter zurückgegebene Adapterobjektzeiger ist ein erforderlicher Parameter für jede dieser Routinen mit Ausnahme von KeFlushIoBuffers und MmGetMdlVirtualAddress, die den Zeiger auf die an Irp-MdlAddress> übergebene MDL erfordern.

Einzelne Treiber rufen diese Abfolge von Supportroutinen an unterschiedlichen Stellen auf, je nachdem, wie die einzelnen Treiber zum Service ihres Geräts implementiert sind. Beispielsweise könnte die StartIo-Routine eines Treibers den Aufruf von AllocateAdapterChannel ausführen, ein anderer Treiber diesen Aufruf von einer Routine aus, die IRPs aus einer vom Treiber erstellten ineinander liegenden Warteschlange entfernt, und ein anderer Treiber könnte diesen Aufruf ausführen, wenn sein untergeordnetes DMA-Gerät angibt, dass er bereit ist, Daten zu übertragen.