Función VirtualAllocExNuma (memoryapi.h)
Reserva, confirma o cambia el estado de una región de memoria dentro del espacio de direcciones virtuales del proceso especificado y especifica el nodo NUMA para la memoria física.
Sintaxis
LPVOID VirtualAllocExNuma(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect,
[in] DWORD nndPreferred
);
Parámetros
[in] hProcess
Identificador de un proceso. La función asigna memoria dentro del espacio de direcciones virtuales de este proceso.
El identificador debe tener el derecho de acceso PROCESS_VM_OPERATION . Para obtener más información, consulte Derechos de acceso y seguridad de procesos.
[in, optional] lpAddress
Puntero que especifica una dirección inicial deseada para la región de páginas que desea asignar.
Si está reservando memoria, la función redondea esta dirección hasta el múltiplo más cercano de la granularidad de asignación.
Si confirma la memoria que ya está reservada, la función redondea esta dirección hasta el límite de página más cercano. Para determinar el tamaño de una página y la granularidad de asignación en el equipo host, use la función GetSystemInfo .
Si lpAddress es NULL, la función determina dónde asignar la región.
[in] dwSize
Tamaño de la región de memoria que se va a asignar, en bytes.
Si lpAddress es NULL, la función redondea dwSize hasta el límite de la página siguiente.
Si lpAddress no es NULL, la función asigna todas las páginas que contienen uno o más bytes en el intervalo de lpAddress a (lpAddress+dwSize)
. Esto significa, por ejemplo, que un intervalo de 2 bytes que extiende un límite de página hace que la función asigne ambas páginas.
[in] flAllocationType
Tipo de asignación de memoria. Este parámetro debe contener uno de los valores siguientes.
Valor | Significado |
---|---|
|
Asigna cargos de memoria (del tamaño total de la memoria y los archivos de paginación en el disco) para las páginas de memoria reservadas especificadas. La función también garantiza que, cuando el autor de la llamada accede inicialmente a la memoria, el contenido será cero. Las páginas físicas reales no se asignan a menos que se acceda realmente a las direcciones virtuales o hasta que se acceda a las direcciones virtuales.
Para reservar y confirmar páginas en un paso, llame a la función con Si se intenta confirmar un intervalo de direcciones específico, se especifica MEM_COMMIT sin MEM_RESERVE y se produce un error en un lpAddress noNULL a menos que ya se haya reservado todo el intervalo. El código de error resultante es ERROR_INVALID_ADDRESS. Un intento de confirmar una página que ya está confirmada no hace que se produzca un error en la función. Esto significa que puede confirmar páginas sin determinar primero el estado de compromiso actual de cada página. |
|
Reserva un intervalo del espacio de direcciones virtuales del proceso sin asignar ningún almacenamiento físico real en la memoria o en el archivo de paginación en el disco.
Para confirmar las páginas reservadas, vuelva a llamar a la función con MEM_COMMIT. Para reservar y confirmar páginas en un paso, llame a la función con Otras funciones de asignación de memoria, como malloc y LocalAlloc, no pueden usar memoria reservada hasta que se haya liberado. |
|
Indica que los datos del intervalo de memoria especificados por lpAddress y dwSize ya no son de interés. Las páginas no deben leerse ni escribirse en el archivo de paginación. Sin embargo, el bloque de memoria se usará de nuevo más adelante, por lo que no debe descommitido. Este valor no se puede usar con ningún otro valor.
El uso de este valor no garantiza que el intervalo operado con MEM_RESET contenga ceros. Si desea que el intervalo contenga ceros, descomprima la memoria y, a continuación, vuelva a enviarla. Cuando se usa MEM_RESET, la función omite el valor de fProtect. Sin embargo, debe establecer fProtect en un valor de protección válido, como PAGE_NOACCESS. La función devuelve un error si usa MEM_RESET y el intervalo de memoria se asigna a un archivo. Una vista compartida solo es aceptable si se asigna a un archivo de paginación. |
|
MEM_RESET_UNDO solo se debe llamar a en un intervalo de direcciones al que MEM_RESET se aplicó correctamente anteriormente. Indica que los datos del intervalo de memoria especificado por lpAddress y dwSize son de interés para el autor de la llamada e intentan invertir los efectos de MEM_RESET. Si la función se realiza correctamente, significa que todos los datos del intervalo de direcciones especificados están intactos. Si se produce un error en la función, al menos algunos de los datos del intervalo de direcciones se han reemplazado por ceros.
Este valor no se puede usar con ningún otro valor. Si se llama a MEM_RESET_UNDO en un intervalo de direcciones que no se MEM_RESET anteriormente, el comportamiento no está definido. Al especificar MEM_RESET, la función VirtualAllocExNuma omite el valor de flProtect. Sin embargo, debe establecer flProtect en un valor de protección válido, como PAGE_NOACCESS. Windows Server 2008 R2, Windows 7, Windows Server 2008 y Windows Vista: La marca MEM_RESET_UNDO no se admite hasta Windows 8 y Windows Server 2012. |
Este parámetro también puede especificar los valores siguientes como se indica.
Valor | Significado |
---|---|
|
Asigna memoria con compatibilidad con páginas grandes.
El tamaño y la alineación deben ser un múltiplo del mínimo de página grande. Para obtener este valor, use la función GetLargePageMinimum . Si especifica este valor, también debe especificar MEM_RESERVE y MEM_COMMIT. |
|
Reserva un intervalo de direcciones que se puede usar para asignar páginas de extensiones de ventanas de direcciones (AWE).
Este valor se debe usar con MEM_RESERVE y ningún otro valor. |
|
Asigna memoria en la dirección más alta posible. |
[in] flProtect
Protección de memoria para la región de las páginas que se van a asignar. Si se confirman las páginas, puede especificar cualquiera de las constantes de protección de memoria.
Los atributos de protección especificados al proteger una página no pueden entrar en conflicto con los especificados al asignar una página.
[in] nndPreferred
Nodo NUMA donde debe residir la memoria física.
Solo se usa al asignar una nueva región de VA (confirmada o reservada). De lo contrario, este parámetro se omite cuando la API se usa para confirmar páginas en una región que ya existe.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es la dirección base de la región asignada de páginas.
Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.
Comentarios
Cada página tiene un estado de página asociado. La función VirtualAllocExNuma puede realizar las siguientes operaciones:
- Confirmación de una región de páginas reservadas
- Reserva de una región de páginas gratuitas
- Reservar y confirmar simultáneamente una región de páginas gratuitas
VirtualAllocExNuma no puede reservar una página reservada. Puede confirmar una página que ya está confirmada. Esto significa que puede confirmar un intervalo de páginas, independientemente de si ya se han confirmado y la función no producirá un error.
Puede usar VirtualAllocExNuma para reservar un bloque de páginas y, a continuación, realizar llamadas adicionales a VirtualAllocExNuma para confirmar páginas individuales del bloque reservado. Esto permite que un proceso reserve un intervalo de su espacio de direcciones virtuales sin consumir almacenamiento físico hasta que sea necesario.
Si el parámetro lpAddress no es NULL, la función usa los parámetros lpAddress y dwSize para calcular la región de las páginas que se van a asignar. El estado actual de todo el intervalo de páginas debe ser compatible con el tipo de asignación especificado por el parámetro flAllocationType . De lo contrario, se produce un error en la función y no se asigna ninguna de las páginas. Este requisito de compatibilidad no impide confirmar una página ya confirmada; consulte la lista anterior.
Dado que VirtualAllocExNuma no asigna ninguna página física, se realizará correctamente si las páginas están disponibles o no en ese nodo o en otro lugar del sistema. Las páginas físicas se asignan a petición. Si el nodo preferido se queda sin páginas, el administrador de memoria usará páginas de otros nodos. Si la memoria se pagina, se usa el mismo proceso cuando se devuelve.
Para ejecutar código generado dinámicamente, use VirtualAllocExNuma para asignar memoria y la función VirtualProtectEx para conceder acceso PAGE_EXECUTE .
La función VirtualAllocExNuma se puede usar para reservar una región de extensiones de ventana de direcciones (AWE) de memoria dentro del espacio de direcciones virtual de un proceso especificado. Después, esta región de memoria se puede usar para asignar páginas físicas dentro y fuera de la memoria virtual según lo requiera la aplicación. Los valores MEM_PHYSICAL y MEM_RESERVE deben establecerse en el parámetro AllocationType . No se debe establecer el valor de MEM_COMMIT . La protección de páginas debe establecerse en PAGE_READWRITE.
La función VirtualFreeEx puede descommitir una página confirmada, liberar el almacenamiento de la página o puede descommitir y liberar simultáneamente una página confirmada. También puede liberar una página reservada, por lo que es una página gratuita.
Para compilar una aplicación que usa esta función, defina _WIN32_WINNT como 0x0600 o posterior.
Ejemplos
Para obtener un ejemplo, vea Asignar memoria desde un nodo NUMA.
Requisitos
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | memoryapi.h (incluye Windows.h, Memoryapi.h) |
Library | onecore.lib |
Archivo DLL | Kernel32.dll |