Поделиться через


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

Версия 3 интерфейса операций DMA доступна начиная с Windows 8. Структура DMA_OPERATIONS для этого интерфейса содержит ряд новых подпрограмм, которые не определены в предыдущих версиях этого интерфейса. Список подпрограмм в версии 3 см. в разделе DMA_OPERATIONS.

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

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

IoGetDmaAdapter
Выделяет объект адаптера DMA и возвращает указатель на DMA_ADAPTER структуру, содержащую интерфейс операций DMA.

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

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

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

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

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

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

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

Примечание В версии 3 интерфейса операций DMA вызовы подпрограммы KeFlushIoBuffers не требуются ни до, ни после передачи DMA. Причина в том, что следующие подпрограммы охватывают необходимость очистки кэшей данных на платформах, которые не обеспечивают когерентность кэша в оборудовании:

  • MapTransferEx обеспечивает очистку кэшей данных процессора перед записью (из памяти на устройство).
  • FlushAdapterBuffersEx гарантирует, что кэши становятся недействительными после операций чтения (с устройства в память).

На процессоре x86 или x64 вызов KeFlushIoBuffers не выполняет никаких операций, и этот вызов, хотя и является ненужным, не влияет на работу аппаратной платформы. На процессоре Arm вызовы KeFlushIoBuffers во время передачи DMA выполняют операции кэша, которые являются ненужными и могут снизить производительность.