Skip to main content

XMemVirtualAlloc

Réserve, valide ou modifie l’état d’une région de pages dans l’espace d’adressage virtuel du processus appelant.
Contrairement à la fonction Win32 standard VirtualAlloc, il n’est pas garanti que la mémoire allouée par cette fonction soit automatiquement initialisée à zéro.

Syntaxe

Paramètres

BaseAddress _In_opt_
Type : PVOID
L’adresse de départ de la région à allouer. Si la mémoire est réservée, l’adresse spécifiée est arrondie au multiple inférieur le plus proche de la granularité d’allocation (4K, 64K ou 2 Mo sur XBOX). Si la mémoire est déjà réservée et qu’elle est en cours de validation, l’adresse est arrondie à la limite de page inférieure. Si ce paramètre est NULL, le système détermine où allouer la région.
Size _In_
Type : SIZE_T
La taille de la région, en octets. Si le paramètre BaseAddress est NULL, cette valeur est arrondie à la limite de page supérieure. Sinon, les pages allouées incluent toutes les pages contenant un ou plusieurs octets dans la plage allant de BaseAddress à BaseAddress+Size. Cela signifie qu’une plage de 2 octets chevauchant une limite de page entraîne l’inclusion des deux pages dans la région allouée.
AllocationType _In_
Type : DWORD
Le type d’allocation de mémoire. Ce paramètre doit contenir l’une des valeurs suivantes. Ce paramètre peut également spécifier les valeurs suivantes, comme indiqué.
Pour les titres ERA, MEM_LARGE_PAGES représentait des pages de 64K, et sur le bureau Windows, il représente des pages de 2 Mo. En raison de cette ambiguïté, il a été retiré du Microsoft Game Development Kit (GDK).

XMemFlags _In_
Type : ULONGLONG
Utilisé sur XBOX pour obtenir certains types de mémoire spécialisés. Ce paramètre doit contenir l’une des valeurs suivantes. Sur XBOX, il est possible d’allouer de la mémoire avec une adresse de mémoire virtuelle restreinte qui garantit que les bits de poids fort ne sont pas utilisés. L’utilisation de l’une des valeurs suivantes restreint l’adresse au nombre de bits indiqué. 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 mémoire graphique ne peut pas être allouée avant que le D3D12Device ait été créé ou que D3DConfigureVirtualMemory ait été appelé. Si de la mémoire visible par le GPU est demandée, les titres sont tenus de spécifier également des indicateurs explicites de protection de page graphique; il n’existe plus de valeur par défaut basée sur les paramètres de protection de page du CPU. Il s’agit d’un changement par rapport aux versions antérieures du système d’exploitation XBOX.
Ce paramètre peut également spécifier les valeurs suivantes, comme indiqué. Sur les appareils Anaconda et les appareils Dante émulant Anaconda, lors de l’utilisation du mode de mémoire de titre avancé, les paramètres suivants peuvent également être appliqués. Ces paramètres sont ignorés dans tous les autres cas.
Ces indicateurs sont facultatifs. S’ils ne sont pas spécifiés, toutes les allocations graphiques utiliseront par défaut XMEM_GPU_OPTIMAL_BANDWIDTH_PREFERRED et toutes les autres allocations utiliseront par défaut XMEM_STANDARD_BANDWIDTH_PREFERRED.
Le paramètre XMemFlags comprend une balise facultative de code à quatre caractères. Les caractères peuvent être n’importe lesquels parmi a-z, A-Z, 0-9 et $. La fonction XMemMakeTag peut être utilisée pour construire l’encodage correct de la valeur de la balise à la bonne position de bits. La balise ne peut être associée qu’à des régions de mémoire validées, et non à des réservations. Cette balise de code à quatre caractères sera représentée par les 24 bits supérieurs du paramètre. La balise peut être récupérée au moyen de XMemVirtualQuery et sera également affichée dans l’analyse de la mémoire de PIX. Exemple :

PageProtection _In_
Type : DWORD
La protection de la mémoire pour la région de pages à allouer. Si les pages sont en cours de validation, vous pouvez spécifier n’importe laquelle des constantes de protection de la mémoire. Les valeurs propres à XBOX suivantes sont autorisées pour le paramètre PageProtection, et l’une d’elles est requise lorsque XMEM_GRAPHICS ou XMEM_GRAPHICS_32BIT_ADDRESS est spécifié. Cette exigence constitue un changement par rapport à la version précédente du système d’exploitation XBOX. Ces valeurs peuvent également être spécifiées à d’autres fonctions de gestion de la mémoire (p. ex. VirtualProtect) pour des adresses mémoire situées dans des plages allouées avec XMEM_GRAPHICS. Ce paramètre peut également spécifier la valeur suivante, comme indiqué.

Valeur de retour

Type : PVOID Si la fonction réussit, la valeur de retour est l’adresse de base de la région de pages allouée. Si la fonction échoue, la valeur de retour est NULL. Pour obtenir des informations d’erreur détaillées, appelez GetLastError.

Remarques

Chaque page a un état de page associé. La fonction XMemVirtualAlloc peut effectuer les opérations suivantes :
  • Valider une région de pages réservées
  • Réserver une région de pages libres
  • Réserver et valider simultanément une région de pages libres
XMemVirtualAlloc ne peut pas réserver une page déjà réservée. Elle peut valider une page déjà validée. Cela signifie que vous pouvez valider une plage de pages, qu’elles aient déjà été validées ou non, sans que la fonction échoue. Vous pouvez utiliser XMemVirtualAlloc pour réserver un bloc de pages, puis effectuer des appels supplémentaires à XMemVirtualAlloc pour valider des pages individuelles du bloc réservé. Cela permet à un processus de réserver une plage de son espace d’adressage virtuel sans consommer de stockage physique jusqu’à ce qu’il soit nécessaire. Si le paramètre BaseAddress n’est pas NULL, la fonction utilise les paramètres BaseAddress et Size pour calculer la région de pages à allouer. L’état actuel de toute la plage de pages doit être compatible avec le type d’allocation spécifié par le paramètre AllocationType. Sinon, la fonction échoue et aucune des pages n’est allouée. Cette exigence de compatibilité n’empêche pas la validation d’une page déjà validée, comme mentionné précédemment. La fonction XMemVirtualAlloc peut être utilisée pour réserver, dans l’espace d’adressage virtuel du processus appelant, une région de mémoire désignée pour le mappage de pages physiques. Cette région de mémoire peut ensuite être utilisée pour mapper des pages physiques dans la mémoire virtuelle et les en retirer selon les besoins de l’application. Les valeurs MEM_RESERVE et MEM_64K_PAGES doivent être définies dans le paramètre AllocationType; la valeur MEM_COMMIT ne doit pas être définie. XMEM_MAPPABLE doit être défini dans le paramètre XMemFlags. L’espace d’adressage réservé de cette façon est validé à l’aide de l’API XMemMapPhysicalPages. La fonction VirtualFree peut annuler la validation d’une page validée, libérant ainsi le stockage de la page, ou elle peut simultanément annuler la validation d’une page validée et la libérer. Elle peut également libérer une page réservée, pour en faire une page libre. En plus de fournir une extension pour les caractéristiques de mémoire propres à XBOX, cette API diffère de VirtualAlloc en n’imposant pas de contrat garantissant que la mémoire retournée est initialisée à zéro. XMemVirtualAlloc ne garantit pas non plus la conservation du contenu antérieur de la mémoire. La plupart des cas d’utilisation de XMemVirtualAlloc dans les jeux consistent à obtenir de la mémoire graphique (qui ne bénéficie généralement pas d’une initialisation à zéro) ou à ajouter de la mémoire à des implémentations de tas qui tirent peu d’avantages de l’initialisation à zéro. De plus, il est simple pour un appelant d’implémenter l’initialisation à zéro de la mémoire retournée au moment de son choix. En n’imposant pas cette garantie de VirtualAlloc, l’implémentation de XMemVirtualAlloc dispose d’une plus grande souplesse pour offrir de meilleures performances. XMemVirtualAlloc diffère également de VirtualAlloc en ce que la mémoire obtenue au moyen de cet appel d’API est immédiatement disponible. En revanche, les adresses mémoire retournées par VirtualAlloc ne seront remplies de pages physiques qu’au premier accès, au moyen d’une opération coûteuse de défaut de page. La mémoire allouée avec XMemVirtualAlloc doit être libérée avec VirtualFree. Les indicateurs de protection de page PAGE_NOCACHE et PAGE_WRITECOMBINE sont fixés au moment de la réservation de la mémoire et ne peuvent pas être modifiés lors d’une demande de validation ultérieure. Toute tentative de modifier l’état de l’un de ces indicateurs lors de la validation de la mémoire sera ignorée silencieusement. La validation de la mémoire réussira, mais la mémoire conservera l’état d’origine de ces indicateurs. Exemples :

Configuration requise

En-tête : xmem.h Bibliothèque : xmem.lib Plateformes prises en charge : consoles de la famille XBOX One et consoles XBOX Series

Voir aussi

Référence XMem
XMemMapPhysicalPages
VirtualFree
Last modified on October 6, 2026