Croisière au coeur d'un OS Etape 4 : La pagination

x86 : activation de la pagination

Mise en place de la pagination

Pour mettre en place la pagination, il faut faire plusieur chose dans l'ordre. Tout d'abord il faut bien configurer les PDE et PTE pour que tout soit bien adressable.
Ensuite il faut initialiser le registre cr3 avec l'adresse du répertoire des pages.
Puis finalement, il faut positionner le bit 31 du registre cr1 à 1 pour activer la pagination et utiliser immédiatement toutes les tables de traduction initialisées ci-dessus.
Il faut donc que tout soit bien fait si on ne veut pas avoir des problèmes avec la gestion de la mémoire.

Identity Mapping

La difficulté principale est qu’il faut garantir que les tables de traduction d’adresses seront correctement initialisées avant d’activer la pagination. Sinon, une fois l’étape 3 validée (cr1), le processeur exécutera n’importe quoi à des adresses incorrectes ou invalides. Pour cela, le plus simple est d’initialiser la pagination en “Identity Mapping” : c’est une configuration particulière des tables de traduction d’adresses. Elle permet que la mise en place de la pagination ne perturbe pas le d´eroulement de l’exécution du code. En effet, avant la mise en place de la pagination, le processeur travaille avec des adresses physiques. Et juste après la mise en place de la pagination il travaille avec des adresses linéaires. Le plus simple pour le programmeur est de ne pas avoir à tenir compte de ce changement. Donc le plus simple est de faire en sorte que les adresses processeur immédiatement avant (adresses physiques) et immédiatement après (adresses linéaires) la mise en place de cette pagination soient égales. L’identity mapping correspond justement à cette configuration particulière des tables de traduction d’adresses : les adresses linéaires sont égales aux adresses en RAM lors de la mise en place de la pagination.
Par la suite, on pourra modifier les tables de traduction d’adresses pour briser cette correspondance directe entre adresses fictives et adresses en RAM, sinon la pagination n’a aucun intérêt.

modification des tables de traduction d'adresse

Il ne suffit pas de mettre à jour les PD et PT. De plus, il faut faire attention au TLB qui contient les anciennes traductions. Il faut donc le vider lors de la modification. Pour cela, deux solutions, soit on remet l'adresse du répertoire des pages dans le cr3 provoquant la suppression de toutes les entrées du TLB, soit il faut utiliser la fonction invlpg qui prends en paramètre une adresse linéaire et qui supprime sa traduction dans le TLB, si elle existe.




page suivante >