Partager via


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 avec le 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 la modification par les threads en mode utilisateur.

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

Protection de copie en écriture

La protection de 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, ce qui permet au système de conserver la mémoire physique et le temps en n’effectuant pas d’opération tant qu’il n’est absolument nécessaire.

Par exemple, supposons que deux processus chargent des pages à partir de la même DLL dans leurs espaces de mémoire virtuelle. Ces pages de mémoire virtuelle sont mappées aux mêmes pages de mémoire physique pour les deux processus. Tant que ni 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 du processus 1 et 2 pages 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 de mémoire virtuelle est mise à jour pour le processus 1. Les deux processus ont désormais leur propre instance de la page en mémoire physique. Par conséquent, il n’est pas possible qu’un processus écrive dans une page physique partagée et que l’autre processus affiche les modifications.

zones et flèches de processus et de remapping 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 d’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ée dans son adresse de base par défaut, elle peut mapper et partager les mêmes pages physiques avec les autres instances, à l’aide de la protection de copie en écriture. Le système permet à ces instances de partager les mêmes pages physiques jusqu’à ce qu’une d’entre 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 de copie en écriture force la copie de certaines pages de la DLL à copier 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 de données, cela peut entraîner la copie de l’intégralité de la section de code vers de nouvelles pages physiques.