Protection de la mémoire

La mémoire qui appartient à un processus est implicitement protégée par son espace d’adressage virtuel privé. En outre, Windows fournit une protection de la mémoire à l’aide du matériel de mémoire virtuelle. L’implémentation de cette protection varie en fonction du processeur. Par exemple, les pages de code dans l’espace d’adressage d’un processus peuvent être marquées en lecture seule et protégées contre toute modification par des threads en mode utilisateur.

Pour obtenir la liste complète des attributs, consultez Constantes de protection de la mémoire.

Protection contre la copie en écriture

La protection contre la copie en écriture est une optimisation qui permet à plusieurs processus de mapper leurs espaces d’adressage virtuels afin qu’ils partagent une page physique jusqu’à ce que l’un des processus modifie la page. Cela fait partie d’une technique appelée évaluation différée, qui permet au système de conserver la mémoire physique et le temps en n’effectuant pas d’opération jusqu’à ce que cela soit absolument nécessaire.

Par exemple, supposons que deux processus chargent des pages de la même DLL dans leurs espaces de mémoire virtuels. Ces pages de mémoire virtuelle sont mappées aux mêmes pages de mémoire physique pour les deux processus. Tant qu’aucun processus n’écrit dans ces pages, ils peuvent mapper et partager les mêmes pages physiques, comme illustré dans le diagramme suivant.

zones et flèches des pages de processus 1 et 2 mappées à la même mémoire physique

Si le processus 1 écrit dans l’une de ces pages, le contenu de la page physique est copié dans une autre page physique et la carte mémoire virtuelle est mise à jour pour le processus 1. Les deux processus ont désormais leurs propres instance de la page en mémoire physique. Par conséquent, il n’est pas possible pour un processus d’écrire dans une page physique partagée et pour l’autre processus de voir les modifications.

zones et flèches des processus et du remappage de mémoire physique

Chargement d’applications et de DLL

Lorsque plusieurs instances de la même application Windows sont chargées, chaque instance est exécutée dans son propre espace d’adressage virtuel protégé. Toutefois, leurs handles de instance (hInstance) ont généralement la même valeur. Cette valeur représente l’adresse de base de l’application dans son espace d’adressage virtuel. Si chaque instance peut être chargé dans son adresse de base par défaut, il peut mapper et partager les mêmes pages physiques avec les autres instances, à l’aide de la protection contre la copie en écriture. Le système permet à ces instances de partager les mêmes pages physiques jusqu’à ce que l’une d’elles modifie une page. Si, pour une raison quelconque, l’une de ces instances ne peut pas être chargée dans l’adresse de base souhaitée, elle reçoit ses propres pages physiques.

Les DLL sont créées avec une adresse de base par défaut. Chaque processus qui utilise une DLL tente de charger la DLL dans son propre espace d’adressage à l’adresse virtuelle par défaut de la DLL. Si plusieurs applications peuvent charger une DLL à son adresse virtuelle par défaut, elles peuvent partager les mêmes pages physiques pour la DLL. Si, pour une raison quelconque, un processus ne peut pas charger la DLL à l’adresse par défaut, il charge la DLL ailleurs. La protection contre la copie en écriture force certaines pages de la DLL à être copiées dans différentes pages physiques pour ce processus, car les correctifs pour les instructions de saut sont écrits dans les pages de la DLL, et ils seront différents pour ce processus. Si la section de code contient de nombreuses références à la section données, cela peut entraîner la copie de la section de code entière vers de nouvelles pages physiques.