Если в описании FPGA-платы, драйвера или сетевого адаптера встречается аббревиатура QDMA, проверьте контекст: чаще всего под ней понимают Queue Direct Memory Access — механизм прямого доступа к памяти, построенный на очередях дескрипторов. Ошибка в трактовке термина приводит к неверной настройке драйверов, поэтому первым делом стоит определить, о какой реализации идёт речь: об IP-блоке AMD/Xilinx QDMA Subsystem for PCI Express, о сетевых контроллерах Qualcomm или о внутренних DMA-движках SoC.

Аббревиатура QDMA не привязана к единственному стандарту — это скорее семейство решений, объединённых общим принципом: передачей данных между устройством и оперативной памятью без постоянного участия центрального процессора. Ниже разберём принцип работы, основные применения и отличия от классического DMA.

Что скрывается за аббревиатурой QDMA

QDMA (Queue DMA) расшифровывается как прямой доступ к памяти на основе очередей. В отличие от простых DMA-контроллеров, где каналов немного и каждый настраивается отдельно, QDMA-движок оперирует большим количеством очередей дескрипторов, через которые программное обеспечение ставит задания на передачу данных.

Термин встречается в нескольких контекстах:

  • 🔧 AMD/Xilinx QDMA Subsystem for PCI Express — IP-блок для FPGA, организующий обмен данными между ПЛИС и хост-системой по шине PCIe;
  • 🌐 DMA-движки в сетевых чипах Qualcomm и других SoC, где очереди используются для обработки сетевого трафика;
  • 💾 Встроенные QDMA-контроллеры в процессорах и микросхемах хранения, обслуживающие множество параллельных потоков данных.

Общее у всех реализаций — идея: вместо того чтобы процессор копировал данные вручную, аппаратный движок сам забирает дескрипторы из очереди, читает адреса источника и приёмника и выполняет перенос.

Как работает QDMA: принцип очередей

В основе лежит кольцевой буфер дескрипторов. Программный драйвер записывает в очередь задания: откуда читать, куда писать, сколько байт перенести. Аппаратная часть последовательно извлекает дескрипторы, выполняет передачу по шине (например, PCIe) и отмечает задание завершённым, часто с генерацией прерывания или записью в очередь статуса.

Такой подход снимает с CPU рутинную работу. Процессор лишь наполняет очередь и обрабатывает результаты, а сам перенос гигабайт данных идёт аппаратно, на полной скорости шины.

Типичный цикл обработки выглядит так:

  • 📥 Драйвер размещает дескриптор в очереди передачи и уведомляет устройство (doorbell-регистр);
  • ⚙️ Движок QDMA читает дескриптор и запрашивает данные из памяти хоста;
  • 📤 Данные передаются в устройство или из него без участия ядер CPU;
  • ✅ Устройство пишет статус завершения, драйвер освобождает буферы.
💡

QDMA отличается от обычного DMA масштабом: сотни и тысячи очередей вместо нескольких фиксированных каналов, что критично для многоядерных систем и виртуализации.