Функция MmAllocateContiguousMemory (ntddk.h)

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

Синтаксис

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

Параметры

[in] NumberOfBytes

Размер (в байтах) блока непрерывной памяти для выделения. Дополнительные сведения см. в подразделе "Примечания".

[in] HighestAcceptableAddress

Максимальный допустимый физический адрес, который может использовать вызывающий объект. Например, если устройство может обращаться только к расположениям в первых 16 мегабайтах диапазона адресов физической памяти процессора, драйвер для этого устройства должен задать для параметра HighestAcceptableAddress значение 0x0000000000FFFFFF.

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

MmAllocateContiguousMemory возвращает базовый виртуальный адрес выделенной памяти. Если запрос не может быть выполнен, подпрограмма возвращает ЗНАЧЕНИЕ NULL.

Комментарии

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

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

Так как непрерывной физической памяти обычно не хватает, ее следует использовать с осторожностью и только при необходимости. Драйвер, который должен использовать непрерывную память, должен выделить эту память во время инициализации драйвера, так как физическая память, скорее всего, фрагментируется с течением времени, так как операционная система выделяет и освобождает память. Как правило, драйвер вызывает MmAllocateContiguousMemory из своей подпрограммы DriverEntry , чтобы выделить внутренний буфер для долгосрочного использования, и освобождает буфер непосредственно перед выгрузкой драйвера.

Память, выделенная MmAllocateContiguousMemory , должна быть освобождена, если память больше не нужна. Вызовите подпрограмму MmFreeContiguousMemory , чтобы освободить память, выделенную MmAllocateContiguousMemory.

Если физическая память фрагментирована на компьютере с большим объемом ОЗУ, вызовы MmAllocateContiguousMemory, требующие от операционной системы поиска смежных блоков памяти, могут серьезно снизить производительность. Начиная с Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008 это значительно сокращается, но выделение непрерывной памяти по-прежнему может быть дорогостоящим. По этой причине драйверы должны избегать повторяющихся вызовов MmAllocateContiguousMemory. Вместо этого драйверы должны выделять все необходимые смежные буферы в подпрограммах DriverEntry и повторно использовать эти буферы.

Память, выделенная MmAllocateContiguousMemory , не инициализирована. Драйвер в режиме ядра должен сначала задать для этой памяти нулевое значение, если он собирается сделать ее видимой для программного обеспечения в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть ntddk.h (включая Wdm.h, Ntddk.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

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

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory