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


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

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

Синтаксис

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

Параметры

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

Самый низкий допустимый физический адрес вызывающего объекта. Например, если устройство может обращаться только к расположениям, превышающим первые 8 мб диапазона адресов физической памяти процессора, драйвер для этого устройства должен задать для 0x0000000000800000 значение LowestAcceptableAddress.

[in] HighestAcceptableAddress

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

[in, optional] BoundaryAddressMultiple

Физический адрес, который не должен пересекать выделенный буфер. Физический адрес должен всегда быть двумя. Этот параметр является необязательным и может быть указан как ноль, чтобы у устройства не было специальных ограничений границ памяти. Дополнительные сведения см. в разделе "Примечания".

[in] CacheType

Указывает значение MEMORY_CACHING_TYPE, указывающее тип кэширования, запрошенного для непрерывной физической памяти.

[in] PreferredNode

Предпочтительный номер узла. Если многопроцессорная система содержит N-узлы, узлы нумеруются от 0 до N-1. Если MM_ANY_NODE_OK указан или компьютер имеет только один узел, то выделение выполняется из любого узла. В противном случае выделение производится из предпочтительного узла или если удовлетворительный диапазон не найден из предпочтительного узла, то возвращается NULL.

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

MmAllocateContiguousMemorySpecifyCacheNode возвращает базовый виртуальный адрес выделенной памяти. Если запрос не может быть удовлетворен, подпрограмма возвращает NULL.

Замечания

Драйвер устройства в режиме ядра вызывает эту подпрограмму для выделения непрерывного блока физической памяти. В многопроцессорной системе доступа к памяти (NUMA) вызывающий объект может указать предпочтительный узел, из которого выделить память. Узел — это коллекция процессоров, которые совместно используют быстрый доступ к области памяти. В мультипроцессоре, отличном от NUMA или однопроцессорной системе, MmAllocateContiguousMemorySpecifyCacheNode обрабатывает всю память как принадлежащую одному узлу и выделяет память из этого узла.

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

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

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

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

Если указать ненулевое значение для параметра BoundaryAddressMultiple, диапазон физических адресов выделенного блока памяти не будет пересекать границу адреса, которая является целым числом этого значения. Драйвер должен задать для этого параметра нулевое значение, если ненулевое значение не требуется для обхода ограничения оборудования. Например, если устройство не может передавать данные через 16-мегабайтовые физические границы, драйвер должен указать значение 0x1000000 для этого параметра, чтобы убедиться, что адреса, которые устройство видит, не обтекают вокруг границы 16-мегабайтов.

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

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно начиная с Windows Vista.
целевая платформа Всеобщий
заголовка ntddk.h (include Wdm.h, Ntddk.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

См. также

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory