Skip to main content

XMemVirtualAlloc

Reserva, confirma o cambia el estado de una región de páginas en el espacio de direcciones virtuales del proceso que realiza la llamada.
A diferencia de la función estándar de Win32 VirtualAlloc, no se garantiza que la memoria asignada por esta función se inicialice automáticamente a cero.

Sintaxis

Parámetros

BaseAddress _In_opt_
Tipo: PVOID
Dirección inicial de la región que se va a asignar. Si la memoria se está reservando, la dirección especificada se redondea hacia abajo hasta el múltiplo más cercano de la granularidad de asignación (4K, 64K o 2 MB en XBOX). Si la memoria ya está reservada y se está confirmando, la dirección se redondea hacia abajo hasta el siguiente límite de página. Si este parámetro es NULL, el sistema determina dónde asignar la región.
Size _In_
Tipo: SIZE_T
Tamaño de la región, en bytes. Si el parámetro BaseAddress es NULL, este valor se redondea hacia arriba hasta el siguiente límite de página. De lo contrario, las páginas asignadas incluyen todas las páginas que contienen uno o más bytes en el intervalo desde BaseAddress hasta BaseAddress+Size. Esto significa que un intervalo de 2 bytes que abarque un límite de página hace que ambas páginas se incluyan en la región asignada.
AllocationType _In_
Tipo: DWORD
Tipo de asignación de memoria. Este parámetro debe contener uno de los valores siguientes. Este parámetro también puede especificar los valores siguientes, según se indica.
Para los títulos de ERA, MEM_LARGE_PAGES representaba páginas de 64K, y en Windows de escritorio representa páginas de 2 MB. Debido a esta ambigüedad, se ha quitado del Microsoft Game Development Kit (GDK).

XMemFlags _In_
Tipo: ULONGLONG
Se usa en XBOX para obtener determinados tipos de memoria especializados. Este parámetro debe contener uno de los valores siguientes. En XBOX es posible asignar memoria con una dirección de memoria virtual restringida que garantiza que no se usen los bits altos. Usar cualquiera de los valores siguientes restringirá la dirección para que use el número de bits indicado. XMEM_40BIT_ADDRESS (0x00007000ULL), XMEM_41BIT_ADDRESS (0x00006000ULL), XMEM_42BIT_ADDRESS (0x00005000ULL), XMEM_43BIT_ADDRESS (0x00004000ULL), XMEM_44BIT_ADDRESS (0x00003000ULL), XMEM_45BIT_ADDRESS (0x00002000ULL), XMEM_46BIT_ADDRESS (0x00001000ULL).
La memoria gráfica no se puede asignar antes de que se haya creado el D3D12Device o de que se haya llamado a D3DConfigureVirtualMemory. Si se solicita memoria que será visible para la GPU, los títulos están obligados a especificar también marcas de protección de página gráfica explícitas; ya no hay un valor predeterminado basado en la configuración de protección de página de la CPU. Esto es un cambio con respecto a las versiones anteriores del sistema operativo de XBOX.
Este parámetro también puede especificar los valores siguientes, según se indica. En los dispositivos Anaconda y los dispositivos Dante que emulan Anaconda, mientras se usa el modo de memoria de título Advanced, también se pueden aplicar los parámetros siguientes. Estos parámetros se ignoran en todos los demás casos.
Estas marcas son opcionales. Si no se especifican, todas las asignaciones gráficas usarán de forma predeterminada XMEM_GPU_OPTIMAL_BANDWIDTH_PREFERRED y todas las demás asignaciones usarán de forma predeterminada XMEM_STANDARD_BANDWIDTH_PREFERRED.
El parámetro XMemFlags incluye una etiqueta opcional de código de cuatro caracteres. Los caracteres pueden ser cualquiera de a-z, A-Z, 0-9 y $. La función XMemMakeTag se puede usar para construir la codificación correcta del valor de la etiqueta en la posición de bit correcta. La etiqueta solo se puede asociar a regiones de memoria confirmadas, no a reservas. Esta etiqueta de código de cuatro caracteres estará representada por los 24 bits superiores del parámetro. La etiqueta se puede recuperar a través de XMemVirtualQuery y también se mostrará en el análisis de memoria de PIX. Ejemplo:

PageProtection _In_
Tipo: DWORD
Protección de memoria para la región de páginas que se va a asignar. Si las páginas se están confirmando, puede especificar cualquiera de las constantes de protección de memoria. Los siguientes valores específicos de XBOX se permiten para el parámetro PageProtection, y uno de ellos es obligatorio cuando se especifica XMEM_GRAPHICS o XMEM_GRAPHICS_32BIT_ADDRESS. Este requisito es un cambio con respecto a la versión anterior del sistema operativo de XBOX. Estos valores también se pueden especificar en otras funciones de administración de memoria (por ejemplo, VirtualProtect) para direcciones de memoria dentro de intervalos que se asignaron con XMEM_GRAPHICS. Este parámetro también puede especificar el valor siguiente, según se indica.

Valor devuelto

Tipo: PVOID Si la función se ejecuta correctamente, el valor devuelto es la dirección base de la región de páginas asignada. Si la función no se ejecuta correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.

Comentarios

Cada página tiene asociado un estado de página. La función XMemVirtualAlloc puede realizar las operaciones siguientes:
  • Confirmar una región de páginas reservadas
  • Reservar una región de páginas libres
  • Reservar y confirmar simultáneamente una región de páginas libres
XMemVirtualAlloc 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 XMemVirtualAlloc para reservar un bloque de páginas y, a continuación, realizar llamadas adicionales a XMemVirtualAlloc para confirmar páginas individuales del bloque reservado. Esto permite a un proceso reservar un intervalo de su espacio de direcciones virtuales sin consumir almacenamiento físico hasta que sea necesario. Si el parámetro BaseAddress no es NULL, la función usa los parámetros BaseAddress y Size para calcular la región de páginas que se va 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 AllocationType. De lo contrario, la función produce un error y no se asigna ninguna página. Este requisito de compatibilidad no impide confirmar una página ya confirmada, como se ha mencionado anteriormente. La función XMemVirtualAlloc se puede usar para reservar una región de memoria dentro del espacio de direcciones virtuales del proceso que realiza la llamada designada para la asignación de páginas físicas. Esta región de memoria se puede usar después para asignar páginas físicas a la memoria virtual y desasignarlas de ella según lo requiera la aplicación. Los valores MEM_RESERVE y MEM_64K_PAGES deben establecerse en el parámetro AllocationType; el valor MEM_COMMIT no debe establecerse. XMEM_MAPPABLE debe establecerse en el parámetro XMemFlags. El espacio de direcciones reservado de esta manera se confirma mediante la API XMemMapPhysicalPages. La función VirtualFree puede anular la confirmación de una página confirmada, liberando su almacenamiento, o puede anular la confirmación y liberar simultáneamente una página confirmada. También puede liberar una página reservada, convirtiéndola en una página libre. Además de proporcionar extensiones para las características de memoria específicas de XBOX, esta API difiere de VirtualAlloc en que no aplica un contrato que garantice que la memoria devuelta se inicialice a cero. XMemVirtualAlloc tampoco garantiza que se conserve el contenido anterior de la memoria. La mayoría de los casos de uso de XMemVirtualAlloc en los juegos implican obtener memoria gráfica (que normalmente no se beneficia de la inicialización a cero) o agregar memoria a implementaciones de montones que obtienen poco valor útil de la inicialización a cero. Además, es trivial para un autor de llamada implementar la inicialización a cero de la memoria devuelta en el momento que elija. Al no aplicar esta garantía de VirtualAlloc, la implementación de XMemVirtualAlloc tiene más flexibilidad para poder proporcionar un mayor rendimiento. XMemVirtualAlloc también difiere de VirtualAlloc en que la memoria obtenida a través de esta llamada de API está disponible de inmediato. Por el contrario, las direcciones de memoria devueltas por VirtualAlloc se rellenarán con páginas físicas solo en el primer acceso, a través de una costosa operación de error de página. Se espera que la memoria asignada con XMemVirtualAlloc se libere con VirtualFree. Las marcas de protección de página PAGE_NOCACHE y PAGE_WRITECOMBINE se fijan en el momento de la reserva de memoria y no se pueden cambiar durante una solicitud de confirmación posterior. Cualquier intento de cambiar el estado de una de estas marcas cuando se confirme la memoria se ignorará de forma silenciosa. La confirmación de memoria se realizará correctamente, pero la memoria tendrá el estado original de estas marcas. Ejemplos:

Requisitos

Encabezado: xmem.h Biblioteca: xmem.lib Plataformas compatibles: consolas de la familia XBOX One y consolas XBOX Series

Consulte también

Referencia de XMem
XMemMapPhysicalPages
VirtualFree
Última modificación el 5 de octubre de 2026