Partager via


Espaces d’adressage virtuels

Les processeurs utilisent des adresses virtuelles lors de la lecture ou de l’écriture dans des emplacements mémoire. Au cours de ces opérations, le processeur convertit l’adresse virtuelle en adresse physique.

L’accès à la mémoire à l’aide d’adresses virtuelles présente plusieurs avantages :

  • Un programme peut utiliser une plage contiguë d’adresses virtuelles pour accéder à une mémoire tampon de mémoire volumineuse et non incohérente dans la mémoire physique.

  • Un programme peut utiliser une plage d’adresses virtuelles pour accéder à une mémoire tampon supérieure à la mémoire physique disponible. Lorsque la mémoire physique est faible, le gestionnaire de mémoire enregistre des pages de mémoire physique (généralement 4 kilo-octets) dans un fichier disque. Le système déplace des pages de données ou de code entre la mémoire physique et le disque en fonction des besoins.

  • Les adresses virtuelles utilisées par différents processus sont isolées. Le code d’un processus ne peut pas modifier la mémoire physique utilisée par un autre processus ou par le système d’exploitation.

La plage d’adresses virtuelles disponible pour un processus est appelée espace d’adressage virtuel du processus. Chaque processus en mode utilisateur a son propre espace d’adressage virtuel privé.

  • Un processus 32 bits a généralement un espace d’adressage virtuel dans la plage de 2 gigaoctets 0x00000000 à 0x7FFFFFFF.

  • Un processus 64 bits sur Windows 64 bits dispose d’un espace d’adressage virtuel dans la plage de 128 téraoctets 0x000'000000000 à 0x7FFF’FFFFFFFF.

Une plage d’adresses virtuelles est parfois appelée plage de mémoire virtuelle. Pour plus d’informations, consultez Limites de mémoire et d’espace d’adressage.

Le diagramme suivant illustre certaines fonctionnalités clés des espaces d’adressage virtuels.

Diagramme montrant les espaces d’adressage virtuels pour deux processus 64 bits, Notepad.exe et MyApp.exe.

Le diagramme montre les espaces d’adressage virtuels pour deux processus 64 bits : Notepad.exe et MyApp.exe. Chaque processus a son propre espace d’adressage virtuel, allant de 0x000'0000000 à 0x7FF’FFFFFFFF. Chaque bloc ombré représente une page (4 kilo-octets) de mémoire virtuelle ou physique. Le processus du Bloc-notes utilise trois pages contiguës d’adresses virtuelles, à partir de 0x7F7'939500000. Toutefois, ces trois pages contiguës d’adresses virtuelles mappent à des pages non contiguées dans la mémoire physique. En outre, les deux processus utilisent une page de mémoire virtuelle commençant à 0x7F7'93950000, mais ces pages virtuelles sont mappées à différentes pages de mémoire physique.

Espace utilisateur et espace système

Les processus tels que Notepad.exe et MyApp.exe s’exécutent en mode utilisateur. Les composants principaux du système d’exploitation et de nombreux pilotes s’exécutent en mode noyau plus privilégié. Pour plus d’informations sur les modes processeur, consultez Mode utilisateur et mode noyau.

Chaque processus en mode utilisateur a son propre espace d’adressage virtuel privé, mais tout le code qui s’exécute en mode noyau partage un seul espace d’adressage virtuel appelé espace système. L’espace d’adressage virtuel d’un processus en mode utilisateur est appelé espace utilisateur.

Dans Windows 32 bits, l’espace d’adressage virtuel total disponible est de 2^32 octets (4 gigaoctets). En règle générale, les 2 gigaoctets inférieurs sont utilisés pour l’espace utilisateur et les 2 gigaoctets supérieurs sont utilisés pour l’espace système.

Diagramme illustrant la division de l’espace d’adressage virtuel total disponible dans Windows 32 bits en espace utilisateur et espace système.

Dans Windows 32 bits, vous pouvez spécifier (au démarrage) que plus de 2 gigaoctets sont disponibles pour l’espace utilisateur. Toutefois, cela signifie que moins d’adresses virtuelles sont disponibles pour l’espace système. Vous pouvez augmenter la taille de l’espace utilisateur jusqu’à 3 gigaoctets, ne laissant que 1 gigaoctet pour l’espace système. Pour augmenter la taille de l’espace utilisateur, utilisez BCDEdit /set increaseuserva.

Dans Windows 64 bits, la quantité théorique d’espace d’adressage virtuel est de 2^64 octets (16 exaoctets), mais seule une petite partie de la plage de 16 exabytets est réellement utilisée.

Le code s’exécutant en mode utilisateur peut accéder à l’espace utilisateur, mais pas à l’espace système. Cette restriction empêche le code en mode utilisateur de lire ou de modifier des structures de données de système d’exploitation protégées. Le code s’exécutant en mode noyau peut accéder à l’espace utilisateur et à l’espace système. Autrement dit, le code s’exécutant en mode noyau peut accéder à l’espace système et à l’espace d’adressage virtuel du processus en mode utilisateur actuel.

Les pilotes s’exécutant en mode noyau doivent être prudents lors de la lecture ou de l’écriture directe dans des adresses dans l’espace utilisateur. Le scénario suivant illustre pourquoi.

  1. Un programme en mode utilisateur lance une demande de lecture de certaines données à partir d’un appareil. Le programme fournit l’adresse de départ d’une mémoire tampon pour recevoir les données.

  2. Une routine de pilote de périphérique, s’exécutant en mode noyau, démarre l’opération de lecture et retourne le contrôle à son appelant.

  3. Plus tard, l’appareil interrompt le thread en cours d’exécution pour indiquer que l’opération de lecture est terminée. Les routines de pilote en mode noyau gèrent l’interruption sur ce thread arbitraire, qui appartient à un processus arbitraire.

  4. À ce stade, le pilote ne doit pas écrire les données à l’adresse de départ fournie par le programme en mode utilisateur à l’étape 1. Cette adresse se trouve dans l’espace d’adressage virtuel du processus qui a lancé la demande, ce qui n’est probablement pas le même que le processus actuel.

Pool paginé et pool non paginé

Dans l’espace utilisateur, toutes les pages de mémoire physique peuvent être paginées dans un fichier disque en fonction des besoins. Dans l’espace système, certaines pages physiques peuvent être paginées et d’autres non. L’espace système comporte deux régions pour l’allocation dynamique de la mémoire : pool paginé et pool non paginé.

La mémoire allouée dans un pool paginé peut être paginée dans un fichier disque si nécessaire. La mémoire allouée dans un pool non paginé ne peut jamais être paginée dans un fichier disque.

Diagramme montrant la différence entre l’allocation de mémoire dans le pool paginé.

Nœuds d’appareil et piles d’appareils

Mode utilisateur et mode noyau