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


Функция MmAllocatePagesForMdl (wdm.h)

Подпрограмма MmAllocatePagesForMdl выделяет заполненные с нуля страницы физической памяти для MDL.

Синтаксис

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Параметры

[in] LowAddress

Задает физический адрес начала первого диапазона адресов, из которого могут поступать выделенные страницы. Если MmAllocatePagesForMdl не может выделить запрошенное количество байтов в первом диапазоне адресов, он выполняет итерацию по дополнительным диапазонам адресов для получения дополнительных страниц. При каждой итерации MmAllocatePagesForMdl добавляет значение SkipBytes в предыдущий начальный адрес, чтобы получить начало следующего диапазона адресов.

[in] HighAddress

Указывает физический адрес конца первого диапазона адресов, из которого могут поступать выделенные страницы.

[in] SkipBytes

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

[in] TotalBytes

Задает общее количество байтов, выделяемых для MDL.

Возвращаемое значение

MmAllocatePagesForMdl возвращает одно из следующих элементов:

Код возврата Описание
Указатель MDL Указатель MDL описывает набор физических страниц в указанном диапазоне адресов. Если запрошенного числа байтов недоступно, MDL описывает объем доступной физической памяти.
NULL В указанных диапазонах адресов отсутствуют страницы физической памяти или недостаточно пула памяти для самого MDL.

Комментарии

Драйверы, работающие в Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версиях Windows, должны использовать подпрограмму MmAllocatePagesForMdlEx вместо MmAllocatePagesForMdl. MmAllocatePagesForMdlEx обеспечивает более высокую производительность, чем MmAllocatePagesForMdl , избегая ненужных сбросов буфера внешнего вида преобразования (TLB) и памяти кэша.

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

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

В зависимости от того, сколько физической памяти в настоящее время доступно в запрошенных диапазонах, MmAllocatePagesForMdl может возвращать MDL, описывающий меньше памяти, чем запрошено. Подпрограмма возвращает значение NULL , если память не выделена. Вызывающий объект должен проверка объем памяти, фактически выделенный для MDL.

Вызывающий объект должен использовать MmFreePagesFromMdl , чтобы освободить страницы памяти, описанные в MDL, созданном MmAllocatePagesForMdl. После вызова MmFreePagesFromMdl вызывающий объект должен также вызвать ExFreePool , чтобы освободить память, выделенную для самой структуры MDL.

В Windows 2000 и более поздних версиях Windows максимальный объем памяти, который MmAllocatePagesForMdl может выделить в одном вызове, составляет (4 гигабайта — PAGE_SIZE). Подпрограмма может удовлетворить запрос на выделение для этой суммы, только если доступно достаточно страниц.

MmAllocatePagesForMdl выполняется в IRQL <= APC_LEVEL. Windows Server 2008 и более поздние версии операционной системы Windows позволяют вызывающим абонентам MmAllocatePagesForMdl вызывать DISPATCH_LEVEL. Однако вы можете повысить производительность драйвера, вызвав APC_LEVEL или ниже.

Вызов MmAllocatePagesForMdl из специального вызова асинхронных процедур ядра (APC) может привести к рекурсивному получению монопольной блокировки, которая находится только в критическом регионе (отключены пользовательские или обычные ПСП ядра), но не в защищенном регионе (все APC отключены).

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL См. раздел "Примечания".
Правила соответствия DDI HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

См. также раздел

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages