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


Использование прямого ввода-вывода с DMA

На следующем рисунке показано, как диспетчер ввода-вывода настраивает запрос IRP_MJ_READ для операции передачи DMA, которая использует прямой ввод-вывод.

схема, иллюстрирующая прямой ввод-вывод в пользовательских буферах для устройств, использующих dma.

На предыдущем рисунке показано, как драйверы могут использовать MdlAddress IRP для передачи данных для запроса на чтение. Драйвер на рисунке использует систему на основе пакетов или шину master DMA и имеет параметр Флаги объекта устройства с помощью DO_DIRECT_IO.

  1. Некоторый диапазон виртуальных адресов пользовательского пространства представляет буфер текущего потока, и содержимое этого буфера может фактически храниться на некотором количестве физически дискообразующих страниц (темная заливка на предыдущем рисунке). Диспетчер ввода-вывода создает MDL для описания этого буфера. MDL — это непрозрачная структура данных, определяемая диспетчером памяти, которая сопоставляет определенный диапазон виртуальных адресов с одним или несколькими диапазонами физических адресов на основе страниц. Дополнительные сведения см. в разделе Использование MDL.

  2. Диспетчер ввода-вывода обслуживает запрос на чтение текущего потока, для которого поток передает диапазон виртуальных адресов пользовательского пространства, представляющих буфер.

  3. Диспетчер ввода-вывода или драйвер файловой системы (FSD) проверяет пользовательский буфер на доступность и вызывает MmProbeAndLockPages с ранее созданным MDL. MmProbeAndLockPages также заполняет соответствующий физический диапазон адресов в MDL.

    Как показано на предыдущем рисунке, MDL для виртуального диапазона может иметь несколько соответствующих записей физических адресов на основе страниц, а виртуальный диапазон для буфера может начинаться и заканчиваться некоторым смещением байтов от начала первой и последней страниц, описанных в MDL.

  4. Диспетчер ввода-вывода предоставляет указатель на MDL (MdlAddress) в IRP, который запрашивает операцию передачи. Пока диспетчер ввода-вывода или файловая система не вызовет MmUnlockPages после завершения драйвера IRP, физические страницы, описанные в MDL, остаются заблокированными и назначенными буферу. Однако виртуальные адреса в таком MDL могут стать невидимыми (и недопустимыми) еще до отправки IRP в драйвер устройства или в любой промежуточный драйвер, который может быть наложен над драйвером устройства.

  5. Если драйвер использует системную систему на основе пакетов или шину master DMA, его подпрограмма AdapterControl вызывает MmGetMdlVirtualAddress с указателем MdlAddress IRP, чтобы получить базовый виртуальный адрес для записей на основе страниц MDL.

  6. Затем подпрограмма AdapterControl вызывает MapTransfer с базовым адресом, возвращенным MmGetMdlVirtualAddress, для чтения данных с устройства непосредственно в физическую память. (Дополнительные сведения см. в разделах Объекты адаптера и DMA.)

Драйверы всегда должны проверка длины буфера. Обратите внимание, что диспетчер ввода-вывода не создает MDL для буфера нулевой длины.