Tables de pages de processus

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:

  1. Dans le cas de l’architecture x86, ce n’est pas le système d’exploitation qui détermine la politique de pagination, c’est le processeur (plus précisément le MMU). La manière dont le système d’exploitation visualise le système de pagination est indépendante de la manière dont il est implémenté. Comme l’a souligné à juste titre un commentateur, il existe un composant spécifique au système d’exploitation pour les modèles de pagination. Ceci est subordonné à la manière de faire du matériel.
  2. Les processeurs x86 32 bits et 64 bits ont des schémas de pagination différents de sorte que vous ne pouvez pas vraiment parler du modèle de pagination x86 sans spécifier également la taille du mot du processeur.

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:

  1. Toutes ces informations de pagination (tables, répertoires, etc.) se trouvent dans la mémoire du kernel. Notez que la mémoire du kernel est un gros chuck et qu’il n’y a pas de concept de mémoire kernel pour un seul processus.
  2. Il n’y a qu’un seul répertoire de page par processus. En effet, le répertoire de la page définit un espace mémoire et chaque processus possède exactement un espace mémoire.
  3. Le dernier paragraphe ci-dessus vous indique comment une adresse est découpée.

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:

  1. La pagination de la mémoire du kernel ne change pas par processus, donc toutes les tables de pages sont toujours visibles par le kernel.
  2. En théorie, il existe également une étape de traduction basée sur un segment. Cependant, la plupart des systèmes pratiques (par exemple, * BSD, Linux, Windows, OS / X) utilisent des segments dont le jeu de base est défini sur 0 et la limite définie sur la limite d’espace d’adressage.