Функция 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) |