Версия 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 выполняют операции кэша, которые являются ненужными и могут снизить производительность.