Версия 3 интерфейса операций DMA

Версия 3 интерфейса операций DMA доступна начиная с Windows 8. The DMA_OPERATIONS structure for this interface contains a number of new routines that are not defined in previous versions of this interface. For a list of the routines in version 3, see DMA_OPERATIONS.

Хотя версия 3 интерфейса операций DMA доступна во всех аппаратных платформах Windows, этот интерфейс имеет множество функций, позволяющих драйверам режима ядра использовать расширенные возможности системных контроллеров DMA в интегрированных каналах System on a Chip (SoC). Эти возможности обычно включают возможность выполнять передачу точечной или сборной DMA. Напротив, предыдущие версии интерфейса операций DMA ограничивают передачу точечной или сборной DMA на основные устройства шины. Интерфейс версии 3 упрощает управление точечными списками и сборами и сокращает потребность в вмешательстве драйвера во время сложных передач DMA.

Чтобы использовать интерфейс операций DMA версии 3 для выполнения передачи DMA, драйвер обычно вызывает следующие подпрограммы:

IoGetDmaAdapter
Allocates a DMA adapter object and returns a pointer to a DMA_ADAPTER structure that contains the DMA operations interface.

GetDmaTransferInfo
Содержит описание ресурсов, необходимых для выполнения передачи DMA, описанной вызывающим оператором.

AllocateAdapterChannelEx
Выделяет ресурсы, необходимые для передачи DMA, и назначает эти ресурсы объекту адаптера DMA.

MapTransferEx
Инициализирует регистры карты и буфер точечной или сборной для передачи DMA и запускает передачу.

FlushAdapterBuffersEx
Выполняет все операции кэша, которые могут потребоваться в конце передачи DMA.

FreeAdapterChannel
Освобождает канал DMA и регистры карт.

PutDmaAdapter
Освобождает объект адаптера.

Эти подпрограммы используются как для основных устройств шины, использующих выделенные контроллеры DMA, так и для подчиненных устройств, использующих системный контроллер DMA. Пошаговое описание вызовов, выполняемых драйвером во время обычной передачи DMA, см. в разделе "Базовый шаблон вызова" для подпрограмм DMA версии 3.

Note In version 3 of the DMA operations interface, calls to the KeFlushIoBuffers routine are not required either before or after DMA transfers. Причина в том, что следующие подпрограммы охватывают необходимость очистки кэшей данных на платформах, которые не применяют когерентность кэша в оборудовании:

  • MapTransferEx ensures that processor data caches are flushed before write (memory-to-device) transfers.
  • FlushAdapterBuffersEx ensures that caches are invalidated after read (device-to-memory) transfers.

On an x86 or x64 processor, the KeFlushIoBuffers call performs no operations, and this call, while unnecessary, does not interfere with the operation of the hardware platform. On an Arm processor, calls to KeFlushIoBuffers during DMA transfers perform cache operations that are unnecessary and can degrade performance.