Freigeben über


Verwenden Packet-Based Bus-Master DMA

Um paketbasiertes DMA zu verwenden, rufen Treiber von Bus-master DMA-Geräten die folgende allgemeine Sequenz von Supportroutinen auf, während sie eine IRP verarbeiten, die eine DMA-Übertragung anfordert:

  • KeFlushIoBuffers kurz vor dem Versuch, Kartenregister für eine Übertragungsanforderung zuzuweisen (weitere Informationen finden Sie unter Verwalten der Cachekohärenz).

  • AllocateAdapterChannel, wenn der Treiber bereit ist, den Bus-master-Adapter für DMA zu programmieren

  • MmGetMdlVirtualAddress zum Abrufen eines Indexes in die MDL, die als initialer Parameter für MapTransfer erforderlich ist, und MapTransfer , um den physischen Systemspeicher, der den Puffer des IRP-Puffers sichert, gerätezugänglich zu machen

    Beachten Sie, dass jeder Treiber möglicherweise mehrere Übertragungsvorgänge ausführen muss, um den aktuellen IRP zu erfüllen, wie unter Aufteilen von Übertragungsanforderungen erläutert. Treiber von Geräten ohne Scatter-/Gather-Funktionen können MapTransfer einmal pro Übertragungsvorgang aufrufen. Treiber von Geräten mit Scatter-/Gather-Funktionen können MapTransfer mehrmals aufrufen, um jeden Übertragungsvorgang einzurichten. Alternativ können diese Treiber die integrierte Scatter/Gather-Unterstützung des Systems verwenden, die unter Using Scatter/Gather DMA beschrieben wird.

  • FlushAdapterBuffers am Ende jedes DMA-Übertragungsvorgangs zum/vom Zielgerät, um zu ermitteln, ob alle angeforderten Daten vollständig übertragen wurden.

  • FreeMapRegisters , sobald alle DMA-Vorgänge für die aktuelle IRP abgeschlossen sind, weil alle angeforderten Daten vollständig übertragen wurden oder weil der Treiber die IRP aufgrund eines Geräte- oder Bus-E/A-Fehlers fehlschlagen muss

Der von IoGetDmaAdapter zurückgegebene Adapterobjektzeiger ist ein erforderlicher Parameter für AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers und FreeMapRegisters. Beachten Sie, dass in Versionen von Windows NT vor Windows 2000 Bus-master-Geräte einen NULL-Adapterobjektzeiger an MapTransfer und FlushAdapterBuffers übergeben können. In Windows 2000 und höher können Treiber dies nicht mehr tun.

KeFlushIoBuffers und MmGetMdlVirtualAddress erfordern einen Zeiger auf die MDL unter Irp-MdlAddress>.

Einzelne Treiber rufen diese Sequenz von Supportroutinen an unterschiedlichen Stellen auf, je nachdem, wie die einzelnen Treiber zum Service ihres Geräts implementiert werden. Beispielsweise kann die StartIo-Routine eines Treibers den Aufruf von AllocateAdapterChannel tätigen, während ein anderer Treiber diesen Aufruf von einer Routine ausgibt, die IRPs aus einer vom Treiber erstellten, ineinander verriegelten Warteschlange oder Gerätewarteschlange entfernt.

Anstatt die in diesem Abschnitt beschriebenen Routinen zu verwenden, kann jeder Treiber, der paketbasiertes DMA verwendet, Supportroutinen verwenden, die zum Optimieren von Scatter/Gather DMA dienen, unabhängig davon, ob sein Gerät über integrierte Unterstützung für Scatter/Gather verfügt. Weitere Informationen finden Sie unter Verwenden von Scatter/Gather DMA .