Función MmAllocateContiguousNodeMemory (ntddk.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 válida más baja que el autor de la llamada puede usar. 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 el autor de la llamada puede usar. Por ejemplo, si un dispositivo puede dirigir solo las ubicaciones de 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
Marcas de bits que especifican la protección que se va a usar para la memoria asignada. El llamador 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 ejecución (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 que realiza la llamada puede especificar si se debe 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 sistema de un solo 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ísico. 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, se debe usar 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, ya 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ísicas 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 encapsulan en un límite de 16 megabytes.
La memoria que mmAllocateContiguousNodeMemory asigna no está inicializada. Un controlador en modo kernel primero debe cero 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 | ntddk.h (incluya Wdm.h, Ntddk.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |
Consulte también
MmAllocateContiguousMemorySpecifyCache