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 >