Таблица описания памяти (Memory Descriptor List, MDL)
Диспетчер памяти использует структуру MDL для описания
набора страниц физической памяти, составляющих буфер виртуальной памяти
в контексте памяти некоторого процесса. Интерпретация MDL не зависит от
контекста памяти, поскольку MDL оперирует со страницами физической памяти.
Получив для данного буфера описание в виде MDL, драйвер в дальнейшем может
использовать буфер в контексте памяти любого процесса. Для того, чтобы
обращаться к такой памяти, необходимо получить для MDL адрес памяти в
системном адресном пространстве. Сделать это можно с помощью функции MmGetSystemAddressForMdl().
,
Кроме того, буфер, описанный с помощью MDL, может быть использован для
операций DMA. Для этого физический адрес внутри MDL должен быть транслирован
в логический адрес (имеющий смысл только для данного устройства DMA) с
помощью функции loMapTransfer().
Интересно отметить следующий момент. MDL предназначен для описания буфера
данных, непрерывного в виртуальной памяти. Однако страницы физической
памяти, список которых собственно и содержит MDL, могут располагаться
в памяти произвольным образом. Это дает возможность «собирать» непрерывный
в виртуальной памяти буфер из различных фрагментов физической памяти без
копирования памяти.
В основном, мы будем встречаться с MDL при передаче данных в драйвер посредством пакетов IRP (которые будут описаны в последующих разделах).