Использование прямого ввода-вывода с DMA
На следующем рисунке показано, как диспетчер ввода-вывода настраивает запрос IRP_MJ_READ для операции передачи DMA, которая использует прямой ввод-вывод.
На предыдущем рисунке показано, как драйверы могут использовать MdlAddress IRP для передачи данных для запроса на чтение. Драйвер на рисунке использует систему на основе пакетов или шину master DMA и имеет параметр Флаги объекта устройства с помощью DO_DIRECT_IO.
Некоторый диапазон виртуальных адресов пользовательского пространства представляет буфер текущего потока, и содержимое этого буфера может фактически храниться на некотором количестве физически дискообразующих страниц (темная заливка на предыдущем рисунке). Диспетчер ввода-вывода создает MDL для описания этого буфера. MDL — это непрозрачная структура данных, определяемая диспетчером памяти, которая сопоставляет определенный диапазон виртуальных адресов с одним или несколькими диапазонами физических адресов на основе страниц. Дополнительные сведения см. в разделе Использование MDL.
Диспетчер ввода-вывода обслуживает запрос на чтение текущего потока, для которого поток передает диапазон виртуальных адресов пользовательского пространства, представляющих буфер.
Диспетчер ввода-вывода или драйвер файловой системы (FSD) проверяет пользовательский буфер на доступность и вызывает MmProbeAndLockPages с ранее созданным MDL. MmProbeAndLockPages также заполняет соответствующий физический диапазон адресов в MDL.
Как показано на предыдущем рисунке, MDL для виртуального диапазона может иметь несколько соответствующих записей физических адресов на основе страниц, а виртуальный диапазон для буфера может начинаться и заканчиваться некоторым смещением байтов от начала первой и последней страниц, описанных в MDL.
Диспетчер ввода-вывода предоставляет указатель на MDL (MdlAddress) в IRP, который запрашивает операцию передачи. Пока диспетчер ввода-вывода или файловая система не вызовет MmUnlockPages после завершения драйвера IRP, физические страницы, описанные в MDL, остаются заблокированными и назначенными буферу. Однако виртуальные адреса в таком MDL могут стать невидимыми (и недопустимыми) еще до отправки IRP в драйвер устройства или в любой промежуточный драйвер, который может быть наложен над драйвером устройства.
Если драйвер использует системную систему на основе пакетов или шину master DMA, его подпрограмма AdapterControl вызывает MmGetMdlVirtualAddress с указателем MdlAddress IRP, чтобы получить базовый виртуальный адрес для записей на основе страниц MDL.
Затем подпрограмма AdapterControl вызывает MapTransfer с базовым адресом, возвращенным MmGetMdlVirtualAddress, для чтения данных с устройства непосредственно в физическую память. (Дополнительные сведения см. в разделах Объекты адаптера и DMA.)
Драйверы всегда должны проверка длины буфера. Обратите внимание, что диспетчер ввода-вывода не создает MDL для буфера нулевой длины.