Je souhaite acquérir une meilleure compréhension de la mémoire virtuelle et du mécanisme de page, en particulier pour les systèmes Windows x86. A partir de ce que j’ai recueilli de diverses ressources en ligne (y compris d’autres questions postées sur SO),
1) Les tables de pages individuelles pour chaque processus sont situées dans l’espace adresse du kernel du même processus.
2) Il n’y a qu’une seule table de pages par processus, contenant le mappage des pages virtuelles sur des pages physiques (ou des frameworks).
3) L’adresse physique correspondant à une adresse virtuelle donnée est calculée par l’unité de gestion de mémoire (MMU) essentiellement en utilisant les 20 premiers bits de l’adresse virtuelle fournie comme index de la table de pages, en utilisant cet index pour extraire l’adresse de début de la trame physique et ensuite appliquer un décalage à cette adresse en fonction des 12 bits restants de l’adresse virtuelle.
Ces trois déclarations sont-elles correctes? Ou est-ce que j’interprète mal l’information?
Donc, tout d’abord, clarifions certaines choses:
Ce qui suit est une version massivement condensée du modèle de pagination 32 bits x86, en utilisant la version la plus simple. Il y a beaucoup de réglages supplémentaires possibles et je sais que différents systèmes d’exploitation les utilisent. Je ne vais pas dans ceux-là parce que je ne suis pas vraiment familiarisé avec les composants internes de la plupart des systèmes d’exploitation et que vous ne devriez vraiment pas y aller tant que vous ne maîsortingserez pas les choses les plus simples. Si vous voulez connaître toutes les merveilles du modèle de pagination x86, vous pouvez accéder à la documentation Intel : Guide de programmation du système Intel
Dans le modèle de pagination le plus simple, l’espace mémoire est divisé en blocs de 4 Ko appelés pages. Un bloc contigu de 1024 d’entre eux est mappé sur une table de pages (qui a également une taille de 4 Ko). Pour un autre niveau d’indirection, toutes les tables de pages 1024 sont mappées sur un répertoire de page de 4 Ko et la base de ce répertoire se trouve dans un registre spécial %cr3
dans le processeur. Cette structure à deux niveaux est en place car la plupart des espaces mémoire dans le système d’exploitation sont rares, ce qui signifie que la plupart sont inutilisés. Vous ne voulez pas garder un tas de tables de pages pour la mémoire qui n’est pas touchée.
Lorsque vous obtenez une adresse mémoire, l’index 10 bits le plus significatif dans le répertoire de la page, qui vous donne la base de la table de pages. L’index suivant de 10 bits dans cette table de page pour vous donner la base de la page physique (également appelée cadre physique). Enfin, le dernier index de 12 bits dans la trame. Le MMU fait tout cela pour vous, en supposant que vous définissez %cr3
à la valeur correcte.
Les systèmes 64 bits ont un système de pagination à 4 niveaux car leurs espaces mémoire sont beaucoup plus rares. De plus, il est possible de choisir des tailles de page qui ne sont pas de 4 Ko.
Pour arriver à vos questions:
Edit: Nettoyage et modifications mineures.
Dans l’ensemble, c’est plutôt correct.
Si la mémoire sert, quelques détails sont un peu en retrait: