Если в описании 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 масштабом: сотни и тысячи очередей вместо нескольких фиксированных каналов, что критично для многоядерных систем и виртуализации.