Функция MmAllocateContiguousMemory (wdm.h)
Подпрограмма MmAllocateContiguousMemory выделяет ряд смежных, непагрегированных физических памяти и сопоставляет его с адресным пространством системы.
Синтаксис
PVOID MmAllocateContiguousMemory(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress
);
Параметры
[in] NumberOfBytes
Размер в байтах блока выделенной непрерывной памяти. Дополнительные сведения см. в разделе "Примечания".
[in] HighestAcceptableAddress
Самый высокий допустимый физический адрес вызывающего объекта. Например, если устройство может обращаться только к расположениям в первых 16 мегабайтах диапазона адресов физической памяти процессора, драйвер для этого устройства должен задать для этого устройства значение HighestAcceptableAddress значение 0x0000000000FFFFFF. Если у вас нет конкретных требований к выделению памяти, установите значение MAXULONG64.
Возвращаемое значение
MmAllocateContiguousMemory возвращает базовый виртуальный адрес выделенной памяти. Если запрос не может быть удовлетворен, подпрограмма возвращает NULL.
Замечания
MmAllocateContiguousMemory выделяет блок непагаченной памяти, который является непрерывным в физическом адресном пространстве. Подпрограмма сопоставляет этот блок с непрерывным блоком виртуальной памяти в адресном пространстве системы и возвращает виртуальный адрес базы этого блока. Подпрограмма выравнивает начальный адрес непрерывного выделения памяти на границу страницы памяти.
Драйверы не должны получать доступ к памяти за пределами запрошенного размера выделения. Например, разработчики не должны предполагать, что их драйверы могут безопасно использовать память между окончанием запрошенного выделения и следующей границой страницы.
Так как непрерывная физическая память обычно находится в нехватке, она должна использоваться кратно и только при необходимости. Драйвер, который должен использовать непрерывную память, должен выделить эту память во время инициализации драйвера, так как физическая память, скорее всего, будет фрагментирована с течением времени, так как операционная система выделяет и освобождает память. Как правило, драйвер вызывает MmAllocateContiguousMemory из своей подпрограммы DriverEnt ry, чтобы выделить внутренний буфер для долгосрочного использования, и освобождает буфер непосредственно перед выгрузкой драйвера.
Память, выделенная MmAllocateContiguousMemory, должна быть освобождена, если память больше не нужна. Вызовите процедуру MmFreeContiguousMemory, чтобы освободить память, выделенную MmAllocateContiguousMemory.
Если физическая память фрагментирована на компьютере с большим объемом ОЗУ, вызовы MmAllocateContiguousMemory, которые требуют от операционной системы поиска смежных блоков памяти, могут значительно снизить производительность. Это снижение значительно снижается, начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, но непрерывная память по-прежнему может быть дорогой для выделения. По этой причине водители должны избегать повторных вызовов MmAllocateContiguousMemory. Вместо этого драйверы должны выделять все необходимые смежные буферы в своих подпрограмм DriverEntry и повторно использовать эти буферы.
Память, которая mmAllocateContiguousMemory выделяется неинициализировано. Драйвер в режиме ядра должен сначала установить это значение нулю, если он будет отображаться в программном обеспечении в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |