Функция MmAllocateNodePagesForMdlEx (wdm.h)
Подпрограмма MmAllocateNodePagesForMdlEx выделяет неупакованную физическую память из идеального узла и выделяет структуру MDL для описания этой памяти.
Синтаксис
PMDL MmAllocateNodePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG IdealNode,
[in] ULONG Flags
);
Параметры
[in] LowAddress
Физический адрес начала первого диапазона адресов, из которого могут поступать выделенные страницы. Если MmAllocateNodePagesForMdlEx не может выделить запрошенное количество байтов в первом диапазоне адресов, подпрограмма выполняет итерацию по дополнительным диапазонам адресов, чтобы получить больше страниц. При каждой итерации MmAllocateNodePagesForMdlEx добавляет значение SkipBytes в предыдущий начальный адрес, чтобы вычислить начало следующего диапазона адресов.
[in] HighAddress
Физический адрес конца первого диапазона адресов, из который могут поступать выделенные страницы.
[in] SkipBytes
Количество байтов, которые следует пропустить с начала предыдущего диапазона адресов, из которых могут поступать выделенные страницы. SkipBytes должен быть целым числом размером страницы виртуальной памяти в байтах.
[in] TotalBytes
Общее количество байтов, выделяемых для MDL.
[in] CacheType
Значение MEMORY_CACHING_TYPE, указывающее тип кэширования, который разрешен для запрошенной памяти.
[in] IdealNode
Идеальный номер узла. Если многопроцессорная система содержит N-узлы, допустимые числа узлов находятся в диапазоне от 0 до N-1. Драйвер может вызвать процедуру KeQueryHighestNodeNodeNumber, чтобы получить наибольшее число узлов. Однопроцессорная или нечисловая система с несколькими обработчиками NUMA имеет только один узел, узел 0, из которого выделяется память. Для многопроцессорной системы NUMA выделение производится из идеального узла, если это возможно. Если недостаточно памяти доступно в идеальном узле для удовлетворения запроса на выделение, и вызывающий объект не задает флаг MM_ALLOCATE_FROM_LOCAL_NODE_ONLY, MmAllocateNodePagesForMdlEx попытается выделить память от других узлов.
[in] Flags
Флаги для этой операции. Присвойте этому параметру значение нулю или битовой стрелке одного или нескольких из следующих битов флага:
MM_DONT_ZERO_ALLOCATION
MM_ALLOCATE_FROM_LOCAL_NODE_ONLY
MM_ALLOCATE_FULLY_REQUIRED
MM_ALLOCATE_NO_WAIT
MM_ALLOCATE_PREFER_CONTIGUOUS
MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS
MM_ALLOCATE_AND_HOT_REMOVE
Дополнительные сведения об этих флагах см. в MM_ALLOCATE_XXX.
Возвращаемое значение
MmAllocateNodePagesForMdlEx возвращает указатель на структуру MDL в случае успешного выполнения. В противном случае, если подпрограмма не выделяет какую-либо память, подпрограмма возвращает NULL.
Возвращаемое значение NULL указывает, что страницы физической памяти недоступны в указанных диапазонах адресов или что для выделения структуры MDL недостаточно ресурсов пула памяти.
Если подпрограмма успешно выделяет некоторые, но не все из запрошенной памяти, MDL описывает столько физической памяти, сколько подпрограмма была в состоянии выделить.
Замечания
В многопроцессорной системе доступа к памяти (NUMA) вызывающий объект может указать идеальный узел, из которого выделяется память. Узел — это коллекция процессоров, которые совместно используют быстрый доступ к области памяти. В мультипроцессоре, отличном от NUMA или однопроцессорной системе, MmAllocateNodePagesForMdlEx обрабатывает всю память как принадлежащую одному узлу и выделяет память из этого узла.
По умолчанию страницы физической памяти, MmAllocateNodePagesForMdlEx, не являются смежными страницами. Вызывающие методы могут переопределить поведение этой подпрограммы по умолчанию, задав бит флага MM_ALLOCATE_PREFER_CONTIGUOUS или MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS в параметре Flags.
MmAllocateNodePagesForMdlEx не сопоставляет выделенную физическую память с виртуальной памятью. При необходимости вызывающий объект может вызывать подпрограмму, например MmMapLockedPagesSpecifyCache для сопоставления страниц физической памяти, описанных MDL.
MmAllocateNodePagesForMdlEx предназначен для драйверов в режиме ядра, которые не нуждаются в соответствующих виртуальных адресах (т. е. они нуждаются в физических страницах и не требуют их физического взаимодействия), а также для драйверов в режиме ядра, которые могут добиться существенного повышения производительности, если физическая память устройства выделена в определенном физическом диапазоне адресов (например, графическая карта AGP).
В зависимости от объема физической памяти, доступной в запрошенных диапазонах, MmAllocateNodePagesForMdlEx может возвращать MDL, описывающий меньше памяти, чем запрошено. Подпрограмма также может возвращать NULL, если память не выделена. Вызывающий объект должен проверить объем памяти, который фактически выделяется, как описано MDL.
Вызывающий объект должен использовать MmFreePagesFromMdl, чтобы освободить страницы памяти, описанные MDL, созданной MmAllocateNodePagesForMdlEx. После вызова MmFreePagesFromMdlвызывающий объект также должен вызывать ExFreePool, чтобы освободить память, выделенную для структуры MDL.
По умолчанию MmAllocateNodePagesForMdlEx заполняет страницы, выделенные нулями. Вызывающий объект может указать флаг MM_DONT_ZERO_ALLOCATION для переопределения этого по умолчанию и, возможно, повышения производительности.
Память, которая MmAllocateNodePagesForMdlEx выделяется неинициализировано, если указать флаг MM_DONT_ZERO_ALLOCATION. Драйвер в режиме ядра должен сначала ноль этой памяти, если драйвер собирается сделать память видимой для программного обеспечения в пользовательском режиме (чтобы избежать утечки потенциально привилегированного содержимого). Дополнительные сведения об этом флаге см. в MM_ALLOCATE_XXX.
Максимальный объем памяти, который MmAllocateNodePagesForMdlEx может выделяться в одном вызове (4 гигабайта — PAGE_SIZE). Подпрограмма может удовлетворить запрос на выделение этого объема только в том случае, если доступны достаточно страниц.
MmAllocateNodePagesForMdlEx выполняется в IRQL <= APC_LEVEL. При необходимости драйвер может вызывать MmAllocateNodePagesForMdlEx по DISPATCH_LEVEL. Однако вы можете повысить производительность драйвера, вызвав APC_LEVEL или ниже.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно начиная с Windows 8. |
целевая платформа | Всеобщий |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (см. раздел "Примечания".) |