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


Функция MmAllocateContiguousMemorySpecifyCacheNode (wdm.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 мегабайт диапазона адресов физической памяти процессора, драйвер для этого устройства должен задать для параметра LowestAcceptableAddress значение 0x0000000000800000.

[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 , не инициализирована. Драйвер режима ядра должен сначала обнулить эту память, если он собирается сделать ее видимой для программного обеспечения в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого).

Требования

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

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

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory