Программирование систем защиты

         

Таблица описания памяти (Memory Descriptor List, MDL)

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


Содержание раздела