Compartir a través de


Función MmAllocateNodePagesForMdlEx (wdm.h)

La rutina MmAllocateNodePagesForMdlEx asigna memoria física no paginada desde un nodo ideal y asigna una estructura MDL para describir esta memoria.

Sintaxis

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
);

Parámetros

[in] LowAddress

Dirección física del inicio del primer intervalo de direcciones desde el que pueden venir las páginas asignadas. Si MmAllocateNodePagesForMdlEx no puede asignar el número solicitado de bytes en el primer intervalo de direcciones, la rutina recorre en iteración intervalos de direcciones adicionales para obtener más páginas. En cada iteración, MmAllocateNodePagesForMdlEx agrega el valor de SkipBytes a la dirección de inicio anterior para calcular el inicio del siguiente intervalo de direcciones.

[in] HighAddress

Dirección física del final del primer intervalo de direcciones del que pueden proceder las páginas asignadas.

[in] SkipBytes

Número de bytes de los que se omitirá desde el principio del intervalo de direcciones anterior del que pueden provenir las páginas asignadas. SkipBytes debe ser un entero múltiplo del tamaño de página de memoria virtual, en bytes.

[in] TotalBytes

Número total de bytes que se van a asignar para MDL.

[in] CacheType

Valor de MEMORY_CACHING_TYPE , que indica el tipo de almacenamiento en caché permitido para la memoria solicitada.

[in] IdealNode

Número de nodo ideal. Si un sistema de varios procesadores contiene N nodos, los números de nodo válidos están en el intervalo de 0 a N-1. El controlador puede llamar a la rutina KeQueryHighestNodeNumber para obtener el número de nodo más alto. Un sistema multiprocesador de un solo procesador o que no es NUMA tiene solo un nodo, nodo 0, desde el que asignar memoria. En el caso de un sistema multiprocesador NUMA, la asignación se realiza desde el nodo ideal, si es posible. Si no hay suficiente memoria disponible en el nodo ideal para satisfacer la solicitud de asignación y el autor de la llamada no establece la marca de MM_ALLOCATE_FROM_LOCAL_NODE_ONLY, MmAllocateNodePagesForMdlEx intentará asignar memoria de otros nodos.

[in] Flags

Marcas para esta operación. Establezca este parámetro en cero o en el or bit a bit de uno o varios de los siguientes bits de marca:

  • 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

Para obtener más información sobre estas marcas, consulte MM_ALLOCATE_XXX.

Valor devuelto

MmAllocateNodePagesForMdlEx devuelve un puntero a una estructura MDL si se ejecuta correctamente. De lo contrario, si la rutina no puede asignar memoria, la rutina devuelve NULL.

Un valor devuelto de NULL indica que no hay páginas de memoria física disponibles en los intervalos de direcciones especificados o que no hay suficiente grupo de memoria disponible para asignar la estructura MDL.

Si la rutina asigna correctamente algunas, pero no todas, de la memoria solicitada, MDL describe tanta memoria física como la rutina pudo asignar.

Comentarios

En un sistema multiprocesador de acceso a memoria no uniforme (NUMA), el autor de la llamada puede especificar un nodo ideal desde el que asignar la memoria. Un nodo es una colección de procesadores que comparten acceso rápido a una región de memoria. En un multiprocesador que no es NUMA o en un sistema de un solo procesador, MmAllocateNodePagesForMdlEx trata toda la memoria como perteneciente a un único nodo y asigna memoria de este nodo.

De forma predeterminada, las páginas de memoria física que devuelve MmAllocateNodePagesForMdlEx no son páginas contiguas. Los autores de llamadas pueden invalidar el comportamiento predeterminado de esta rutina estableciendo el bit de marca MM_ALLOCATE_PREFER_CONTIGUOUS o MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS en el parámetro Flags .

MmAllocateNodePagesForMdlEx no asigna la memoria física asignada a la memoria virtual. Si es necesario, el autor de la llamada puede llamar a una rutina como MmMapLockedPagesSpecifyCache para asignar las páginas de memoria física descritas por MDL.

MmAllocateNodePagesForMdlEx está diseñado para controladores en modo kernel que no necesitan direcciones virtuales correspondientes (es decir, necesitan páginas físicas y no necesitan que sean físicamente contiguos) y para los controladores en modo kernel que pueden lograr importantes ganancias de rendimiento si se asigna memoria física para un dispositivo en un intervalo de direcciones físicas específico (por ejemplo, una tarjeta gráfica AGP).

Dependiendo de la cantidad de memoria física disponible actualmente en los intervalos solicitados, MmAllocateNodePagesForMdlEx podría devolver una MDL que describa menos memoria de la solicitada. La rutina también puede devolver NULL si no se asignó ninguna memoria. El autor de la llamada debe comprobar la cantidad de memoria que se asigna realmente, tal y como se describe en MDL.

El autor de la llamada debe usar MmFreePagesFromMdl para liberar las páginas de memoria descritas por una MDL creada por MmAllocateNodePagesForMdlEx. Después de llamar a MmFreePagesFromMdl, el autor de la llamada también debe llamar a ExFreePool para liberar la memoria asignada para la estructura MDL.

De forma predeterminada, MmAllocateNodePagesForMdlEx rellena las páginas que asigna con ceros. El autor de la llamada puede especificar la marca MM_DONT_ZERO_ALLOCATION para invalidar este valor predeterminado y, posiblemente, mejorar el rendimiento.

La memoria que mmAllocateNodePagesForMdlEx asigna no se inicializa si especifica la marca de MM_DONT_ZERO_ALLOCATION. Un controlador en modo kernel debe cero en primer lugar esta memoria si el controlador va a hacer que la memoria sea visible para el software en modo de usuario (para evitar fugas de contenido potencialmente con privilegios). Para obtener más información sobre esta marca, consulte MM_ALLOCATE_XXX.

La cantidad máxima de memoria que MmAllocateNodePagesForMdlEx puede asignar en una sola llamada es (4 gigabytes - PAGE_SIZE). La rutina puede satisfacer una solicitud de asignación para esta cantidad solo si hay suficientes páginas disponibles.

MmAllocateNodePagesForMdlEx se ejecuta en IRQL <= APC_LEVEL. Si es necesario, el controlador puede llamar a MmAllocateNodePagesForMdlEx en DISPATCH_LEVEL. Sin embargo, puede mejorar el rendimiento del controlador llamando a APC_LEVEL o a continuación.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 8.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (consulte la sección Comentarios).

Consulte también

ExFreePool

KeQueryHighestNodeNumber

MDL

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache