Función MmAllocateContiguousNodeMemory (wdm.h)

La rutina MmAllocateContiguousNodeMemory asigna un intervalo de memoria física contigua y no paginada y la asigna al espacio de direcciones del sistema.

Sintaxis

PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [in]           NODE_REQUIREMENT PreferredNode
);

Parámetros

[in] NumberOfBytes

Tamaño, en bytes, del bloque de memoria contigua que se va a asignar. Para obtener más información, vea la sección Comentarios.

[in] LowestAcceptableAddress

La dirección física más baja válida que puede usar el autor de la llamada. Por ejemplo, si un dispositivo solo puede abordar ubicaciones por encima de los primeros 8 megabytes del intervalo de direcciones de memoria física del procesador, el controlador de este dispositivo debe establecer LowestAcceptableAddress en 0x0000000000800000.

[in] HighestAcceptableAddress

La dirección física válida más alta que puede usar el autor de la llamada. Por ejemplo, si un dispositivo solo puede abordar ubicaciones en los primeros 16 megabytes del intervalo de direcciones de memoria física del procesador, el controlador de este dispositivo debe establecer HighestAcceptableAddress en 0x0000000000FFFFFF.

[in, optional] BoundaryAddressMultiple

Dirección física múltiple que el búfer asignado no debe cruzar. Una dirección física múltiple siempre debe ser una potencia de dos. Este parámetro es opcional y se puede especificar como cero para indicar que el dispositivo no tiene restricciones de límites de memoria especiales. Para obtener más información, vea la sección Comentarios.

[in] Protect

Marca bits que especifican la protección que se va a usar para la memoria asignada. El autor de la llamada debe establecer uno (pero no ambos) de los siguientes bits de marca en el parámetro Protect .

Bit de marca Significado
PAGE_READWRITE Asigne memoria de lectura y escritura, sin ejecutar (NX). La mayoría de los autores de llamadas deben establecer este bit de marca. Para obtener más información, vea la sección Comentarios.
PAGE_EXECUTE_READWRITE Asigne memoria de lectura y escritura que sea ejecutable. Este bit de marca solo debe establecerse si el autor de la llamada requiere la capacidad de ejecutar instrucciones en la memoria asignada.

Además, el autor de la llamada puede establecer uno (pero no ambos) de los siguientes bits de marca opcionales en el parámetro Protect .

Bit de marca Significado
PAGE_NOCACHE Asigne memoria no almacenada en caché. Este bit de marca es similar a llamar a MmAllocateContiguousMemorySpecifyCache con CacheType establecido en MmNonCached.
PAGE_WRITECOMBINE Asigne memoria combinada de escritura. Este bit de marca es similar a llamar a MmAllocateContiguousMemorySpecifyCache con CacheType establecido en MmWriteCombined.

Si no se especifica ni PAGE_NOCACHE ni PAGE_WRITECOMBINE, la memoria asignada se almacena completamente en caché. En este caso, el efecto es similar a llamar a MmAllocateContiguousMemorySpecifyCache con CacheType establecido en MmCached.

[in] PreferredNode

Número de nodo preferido. Si un sistema de varios procesadores contiene N nodos, los nodos se numeran de 0 a N-1. Si el autor de la llamada establece PreferredNode en MM_ANY_NODE_OK, la rutina elige a qué nodo asignar memoria. De lo contrario, si no se puede asignar memoria en el intervalo de direcciones especificado desde el nodo preferido, la rutina devuelve NULL.

Valor devuelto

MmAllocateContiguousNodeMemory devuelve la dirección virtual base para la memoria asignada. Si no se puede satisfacer la solicitud, la rutina devuelve NULL.

Comentarios

Un controlador de dispositivo en modo kernel llama a esta rutina para asignar un bloque contiguo de memoria física. El controlador de llamada puede especificar si se va a usar memoria sin ejecutar (NX) para la asignación. En un sistema de multiprocesador de acceso a memoria no uniforme (NUMA), el autor de la llamada puede especificar un nodo preferido 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 único sistema de procesador, MmAllocateContiguousNodeMemory trata toda la memoria como perteneciente a un único nodo y asigna memoria de este nodo.

MmAllocateContiguousNodeMemory asigna un bloque de memoria no paginada que es contiguo en el espacio de direcciones físicos. La rutina asigna este bloque a un bloque contiguo de memoria virtual en el espacio de direcciones del sistema y devuelve la dirección virtual de la base de este bloque. La rutina alinea la dirección inicial de una asignación de memoria contigua a un límite de página de memoria.

Los controladores no deben tener acceso a la memoria más allá del tamaño de asignación solicitado. Por ejemplo, los desarrolladores no deben suponer que sus controladores pueden usar memoria de forma segura entre el final de su asignación solicitada y el límite de la página siguiente.

Dado que la memoria física contigua suele estar en breve suministro, debe usarse con moderación y solo cuando sea necesario. Un controlador que debe usar memoria contigua debe asignar esta memoria durante la inicialización del controlador, ya que es probable que la memoria física se fragmente con el tiempo a medida que el sistema operativo asigna y libera memoria. Normalmente, un controlador llama a MmAllocateContiguousNodeMemory desde su rutina DriverEntry para asignar un búfer interno para su uso a largo plazo y libera el búfer justo antes de descargar el controlador.

La memoria asignada por MmAllocateContiguousNodeMemory debe liberarse cuando la memoria ya no sea necesaria. Llame a la rutina MmFreeContiguousMemory para liberar memoria asignada por MmAllocateContiguousNodeMemory.

MmAllocateContiguousNodeMemory es similar a la rutina MmAllocateContiguousMemorySpecifyCacheNode . A diferencia de MmAllocateContiguousMemorySpecifyCacheNode, MmAllocateContiguousNodeMemory se puede usar para asignar memoria sin ejecutar (NX). Como procedimiento recomendado, un controlador debe asignar memoria NX a menos que el controlador requiera explícitamente la capacidad de ejecutar instrucciones en la memoria asignada. Al asignar memoria NX, un controlador mejora la seguridad evitando que el software malintencionado ejecute instrucciones en esta memoria. La memoria asignada por las rutinas MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache y MmAllocateContiguousMemorySpecifyCacheNode siempre es ejecutable.

Si especifica un valor distinto de cero para el parámetro BoundaryAddressMultiple , el intervalo de direcciones físicos del bloque de memoria asignado no cruzará un límite de dirección que sea un entero múltiplo de este valor. Un controlador debe establecer este parámetro en cero a menos que se requiera un valor distinto de cero para solucionar una limitación de hardware. Por ejemplo, si un dispositivo no puede transferir datos a través de límites físicos de 16 megabytes, el controlador debe especificar un valor de 0x1000000 para este parámetro para asegurarse de que las direcciones que ve el dispositivo no se ajustan en un límite de 16 megabytes.

Memoria que MmAllocateContiguousNodeMemory asigna no se inicializa. Un controlador en modo kernel debe cero primero esta memoria si va a hacer que sea visible para el software en modo de usuario (para evitar la pérdida de contenido potencialmente con privilegios).

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)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Consulte también

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory