Freigeben über


Version 3 der DMA-Betriebsschnittstelle

Version 3 der DMA-Betriebsschnittstelle ist ab Windows 8 verfügbar. Die DMA_OPERATIONS-Struktur für diese Schnittstelle enthält eine Reihe neuer Routinen, die in früheren Versionen dieser Schnittstelle nicht definiert sind. Eine Liste der Routinen in Version 3 finden Sie unter DMA_OPERATIONS.

Obwohl Version 3 der DMA-Betriebsschnittstelle auf allen Windows-Hardwareplattformen verfügbar ist, verfügt diese Schnittstelle über viele Funktionen, mit denen Kernelmodustreiber die erweiterten Funktionen von System-DMA-Controllern in integrierten SoC-Leitungen (System on a Chip) nutzen können. Zu diesen Funktionen gehört in der Regel die Möglichkeit, DMA-Übertragungen zu punktieren/zu sammeln. Im Gegensatz dazu beschränken frühere Versionen der DMA-Betriebsschnittstelle die Scatter/Gather-DMA-Übertragungen auf Bus-master-Geräte. Die Version-3-Schnittstelle vereinfacht die Verwaltung von Scatter/Gather-Listen und reduziert den Bedarf an Treibereingriffen bei komplexen DMA-Übertragungen.

Um Version 3 der DMA-Betriebsschnittstelle zum Ausführen einer DMA-Übertragung zu verwenden, ruft ein Treiber in der Regel die folgenden Routinen auf:

IoGetDmaAdapter
Weist ein DMA-Adapterobjekt zu und gibt einen Zeiger auf eine DMA_ADAPTER-Struktur zurück, die die DMA-Betriebsschnittstelle enthält.

GetDmaTransferInfo
Enthält eine Beschreibung der Ressourcen, die zum Ausführen der vom Aufrufer beschriebenen DMA-Übertragung erforderlich sind.

AllocateAdapterChannelEx
Weist die für die DMA-Übertragung erforderlichen Ressourcen zu und weist diese Ressourcen dem DMA-Adapterobjekt zu.

MapTransferEx
Initialisiert die Kartenregister und den Scatter/Gather-Puffer für die DMA-Übertragung und startet die Übertragung.

FlushAdapterBuffersEx
Führt alle Cachevorgänge aus, die möglicherweise am Ende der DMA-Übertragung erforderlich sind.

FreeAdapterChannel
Gibt den DMA-Kanal und die Kartenregister frei.

PutDmaAdapter
Gibt das Adapterobjekt frei.

Diese Routinen werden sowohl für Bus-master-Geräte verwendet, die dedizierte DMA-Controller verwenden, als auch für untergeordnete Geräte, die einen System-DMA-Controller verwenden. Eine schrittweise Beschreibung der Aufrufe, die ein Treiber während einer typischen DMA-Übertragung durchführt, finden Sie unter Grundlegendes Anrufmuster für DMA-Routinen der Version-3.

Hinweis In Version 3 der DMA-Betriebsschnittstelle sind Aufrufe der KeFlushIoBuffers-Routine weder vor noch nach DMA-Übertragungen erforderlich. Der Grund ist, dass die folgenden Routinen die Notwendigkeit des Leerens von Datencaches auf Plattformen abdecken, die die Cachekohärenz in der Hardware nicht erzwingen:

  • MapTransferEx stellt sicher, dass Prozessordatencaches vor der Übertragung von Schreibvorgängen (Speicher zu Gerät) geleert werden.
  • FlushAdapterBuffersEx stellt sicher, dass Caches nach der Übertragung von Lesevorgängen (Device-to-Memory) ungültig werden.

Auf einem x86- oder x64-Prozessor führt der KeFlushIoBuffers-Aufruf keine Vorgänge aus, und dieser Aufruf ist zwar unnötig, beeinträchtigt aber nicht den Betrieb der Hardwareplattform. Auf einem Arm-Prozessor führen Aufrufe von KeFlushIoBuffers während DMA-Übertragungen Cachevorgänge aus, die unnötig sind und die Leistung beeinträchtigen können.