Partager via


Fonction VirtualAllocExNuma (memoryapi.h)

Réserve, valide ou modifie l’état d’une région de mémoire dans l’espace d’adressage virtuel du processus spécifié, et spécifie le nœud NUMA pour la mémoire physique.

Syntaxe

LPVOID VirtualAllocExNuma(
  [in]           HANDLE hProcess,
  [in, optional] LPVOID lpAddress,
  [in]           SIZE_T dwSize,
  [in]           DWORD  flAllocationType,
  [in]           DWORD  flProtect,
  [in]           DWORD  nndPreferred
);

Paramètres

[in] hProcess

Handle d’un processus. La fonction alloue de la mémoire dans l’espace d’adressage virtuel de ce processus.

Le handle doit avoir le droit d’accès PROCESS_VM_OPERATION . Pour plus d’informations, consultez Traiter les droits de sécurité et d’accès.

[in, optional] lpAddress

Pointeur qui spécifie une adresse de départ souhaitée pour la région de pages que vous souhaitez allouer.

Si vous réservez de la mémoire, la fonction arrondit cette adresse au multiple le plus proche de la granularité d’allocation.

Si vous validez la mémoire déjà réservée, la fonction arrondit cette adresse jusqu’à la limite de page la plus proche. Pour déterminer la taille d’une page et la granularité d’allocation sur l’ordinateur hôte, utilisez la fonction GetSystemInfo .

Si lpAddress a la valeur NULL, la fonction détermine où allouer la région.

[in] dwSize

Taille de la région de mémoire à allouer, en octets.

Si lpAddress a la valeur NULL, la fonction arrondit dwSize jusqu’à la limite de la page suivante.

Si lpAddress n’a pas la valeur NULL, la fonction alloue toutes les pages qui contiennent un ou plusieurs octets dans la plage de lpAddress à (lpAddress+dwSize). Cela signifie, par exemple, qu’une plage de 2 octets qui chevauche une limite de page oblige la fonction à allouer les deux pages.

[in] flAllocationType

Type d’allocation de mémoire. Ce paramètre doit contenir l’une des valeurs suivantes.

Valeur Signification
MEM_COMMIT
0x00001000
Alloue des frais de mémoire (à partir de la taille globale de la mémoire et des fichiers de pagination sur le disque) pour les pages de mémoire réservées spécifiées. La fonction garantit également que lorsque l’appelant accède ultérieurement à la mémoire, le contenu est égal à zéro. Les pages physiques réelles ne sont allouées que si les adresses virtuelles ne sont pas réellement accessibles.

Pour réserver et valider les pages en une seule étape, appelez la fonction avec MEM_COMMIT | MEM_RESERVE.

La tentative de validation d’une plage d’adresses spécifique en spécifiant MEM_COMMIT sans MEM_RESERVE et une adresse lpAddress non NULL échoue, sauf si la plage entière a déjà été réservée. Le code d’erreur résultant est ERROR_INVALID_ADDRESS.

Une tentative de validation d’une page déjà validée n’entraîne pas l’échec de la fonction. Cela signifie que vous pouvez valider des pages sans déterminer d’abord l’état d’engagement actuel de chaque page.

MEM_RESERVE
0x00002000
Réserve une plage de l’espace d’adressage virtuel du processus sans allouer de stockage physique réel en mémoire ou dans le fichier de pagination sur le disque.

Vous validez les pages réservées en appelant à nouveau la fonction avec MEM_COMMIT. Pour réserver et valider les pages en une seule étape, appelez la fonction avec MEM_COMMIT | MEM_RESERVE.

D’autres fonctions d’allocation de mémoire, telles que malloc et LocalAlloc, ne peuvent pas utiliser la mémoire réservée tant qu’elle n’a pas été libérée.

MEM_RESET
0x00080000
Indique que les données de la plage de mémoire spécifiée par lpAddress et dwSize ne sont plus intéressantes. Les pages ne doivent pas être lues ou écrites dans le fichier de pagination. Toutefois, le bloc de mémoire sera à nouveau utilisé ultérieurement. Il ne doit donc pas être décompressé. Cette valeur ne peut pas être utilisée avec une autre valeur.

L’utilisation de cette valeur ne garantit pas que la plage exploitée avec MEM_RESET contiendra des zéros. Si vous souhaitez que la plage contienne des zéros, supprimez la mémoire, puis recommencez-la.

Lorsque vous utilisez MEM_RESET, la fonction ignore la valeur de fProtect. Toutefois, vous devez toujours définir fProtect sur une valeur de protection valide, telle que PAGE_NOACCESS.

La fonction retourne une erreur si vous utilisez MEM_RESET et que la plage de mémoire est mappée à un fichier. Une vue partagée n’est acceptable que si elle est mappée à un fichier de pagination.

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO ne doit être appelé que sur une plage d’adresses à laquelle MEM_RESET a été appliqué avec succès précédemment. Cela indique que les données de la plage de mémoire spécifiée par lpAddress et dwSize intéressent l’appelant et tentent d’inverser les effets de MEM_RESET. Si la fonction réussit, cela signifie que toutes les données de la plage d’adresses spécifiée sont intactes. Si la fonction échoue, au moins certaines données de la plage d’adresses ont été remplacées par des zéros.

Cette valeur ne peut pas être utilisée avec une autre valeur. Si MEM_RESET_UNDO est appelé sur une plage d’adresses qui n’était pas MEM_RESET précédemment, le comportement n’est pas défini. Lorsque vous spécifiez MEM_RESET, la fonction VirtualAllocExNuma ignore la valeur de flProtect. Toutefois, vous devez toujours définir flProtect sur une valeur de protection valide, telle que PAGE_NOACCESS.

Windows Server 2008 R2, Windows 7, Windows Server 2008 et Windows Vista : L’indicateur MEM_RESET_UNDO n’est pas pris en charge tant que Windows 8 et Windows Server 2012.

 

Ce paramètre peut également spécifier les valeurs suivantes comme indiqué.

Valeur Signification
MEM_LARGE_PAGES
0x20000000
Alloue de la mémoire à l’aide de la prise en charge de grandes pages.

La taille et l’alignement doivent être un multiple du minimum de grandes pages. Pour obtenir cette valeur, utilisez la fonction GetLargePageMinimum .

Si vous spécifiez cette valeur, vous devez également spécifier MEM_RESERVE et MEM_COMMIT.

MEM_PHYSICAL
0x00400000
Réserve une plage d’adresses qui peut être utilisée pour mapper les pages des extensions de fenêtrage d’adresses (AWE).

Cette valeur doit être utilisée avec MEM_RESERVE et aucune autre valeur.

MEM_TOP_DOWN
0x00100000
Alloue de la mémoire à l’adresse la plus élevée possible.

[in] flProtect

Protection de la mémoire pour la région de pages à allouer. Si les pages sont validées, vous pouvez spécifier l’une des constantes de protection de la mémoire.

Les attributs de protection spécifiés lors de la protection d’une page ne peuvent pas entrer en conflit avec ceux spécifiés lors de l’allocation d’une page.

[in] nndPreferred

Nœud NUMA dans lequel la mémoire physique doit résider.

Utilisé uniquement lors de l’allocation d’une nouvelle région VA (validée ou réservée). Sinon, ce paramètre est ignoré lorsque l’API est utilisée pour valider des pages dans une région qui existe déjà

Valeur retournée

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étaillées sur l’erreur, appelez GetLastError.

Notes

Chaque page a un état de page associé. La fonction VirtualAllocExNuma peut effectuer les opérations suivantes :

  • Valider une région de pages réservées
  • Réserver une région de pages gratuites
  • Réserver et valider simultanément une région de pages libres

VirtualAllocExNuma ne peut pas réserver une page réservée. Il 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, et que la fonction n’échoue pas.

Vous pouvez utiliser VirtualAllocExNuma pour réserver un bloc de pages, puis effectuer des appels supplémentaires à VirtualAllocExNuma pour valider des pages individuelles à partir 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 lpAddress n’est pas NULL, la fonction utilise les paramètres lpAddress et dwSize pour calculer la région des pages à allouer. L’état actuel de l’ensemble de la plage de pages doit être compatible avec le type d’allocation spécifié par le paramètre flAllocationType . 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 ; consultez la liste précédente.

Étant donné que VirtualAllocExNuma n’alloue pas de pages physiques, elle réussit, que les pages soient disponibles sur ce nœud ou ailleurs dans le système. Les pages physiques sont allouées à la demande. Si le nœud préféré manque de pages, le gestionnaire de mémoire utilise les pages d’autres nœuds. Si la mémoire est paginée, le même processus est utilisé lorsqu’il est ramené.

Pour exécuter du code généré dynamiquement, utilisez VirtualAllocExNuma pour allouer de la mémoire et la fonction VirtualProtectEx pour accorder PAGE_EXECUTE accès.

La fonction VirtualAllocExNuma peut être utilisée pour réserver une région AWE ( Address Windowing Extensions ) de mémoire dans l’espace d’adressage virtuel d’un processus spécifié. Cette région de mémoire peut ensuite être utilisée pour mapper des pages physiques dans et hors de la mémoire virtuelle, selon les besoins de l’application. Les valeurs MEM_PHYSICAL et MEM_RESERVE doivent être définies dans le paramètre AllocationType . La valeur MEM_COMMIT ne doit pas être définie. La protection de page doit être définie sur PAGE_READWRITE.

La fonction VirtualFreeEx peut désengager une page validée, en libérant le stockage de la page, ou elle peut simultanément déscommit et libérer une page validée. Il peut également libérer une page réservée, ce qui en fait une page gratuite.

Pour compiler une application qui utilise cette fonction, définissez _WIN32_WINNT comme 0x0600 ou version ultérieure.

Exemples

Pour obtenir un exemple, consultez Allocation de mémoire à partir d’un nœud NUMA.

Spécifications

   
Client minimal pris en charge Windows Vista [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2008 [applications de bureau uniquement]
Plateforme cible Windows
En-tête memoryapi.h (inclure Windows.h, Memoryapi.h)
Bibliothèque onecore.lib
DLL Kernel32.dll

Voir aussi

Fonctions de gestion de la mémoire

Prise en charge de NUMA

Fonctions de mémoire virtuelle

VirtualAllocEx

VirtualFreeEx

VirtualLock

VirtualProtect

VirtualQuery