Freigeben über


Verwenden von paketbasiertem System-DMA

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

  • KeFlushIoBuffers direkt vor dem Versuch, den DMA-Controller des Systems zuzuweisen (weitere Informationen finden Sie unter Verwalten der Cachekoherency)

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

    AllocateAdapterChannel ruft wiederum die AdapterControl-Routine des Treibers auf.

  • MmGetMdlVirtualAddress, um einen Index in die MDL zu erhalten, der als Parameter im ersten Aufruf von MapTransfer erforderlich ist

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

    Möglicherweise muss ein Treiber MapTransfer mehrmals aufrufen, um alle angeforderten Daten zu übertragen, wie in teilenden Übertragungsanforderungen erläutert.

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

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

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

Der von IoGetDmaAdapter urü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 verschiedenen Stellen auf, je nachdem, wie jeder Treiber für den Dienst des Geräts implementiert wird. Beispielsweise könnte die Routine StartIo eines Treibers den Aufruf von AllocateAdapterChanneldurchführen, ein anderer Treiber könnte diesen Aufruf aus einer Routine durchführen, die IRPs aus einer vom Treiber erstellten verriegelten Warteschlange entfernt, und noch ein anderer Treiber könnte diesen Aufruf durchführen, wenn sein untergeordnetes DMA-Gerät anzeigt, dass es zur Datenübertragung bereit ist.