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