Page prec      Fin page Page suiv.

Transformation adresse virtuelle -> adresse physique

    Comme nous l'avons dit plus haut, en modes réel et V86, l'adresse effective (adresse physique), codée sur 20 bits, est simplement calculée par :
 
adresse_physique := sélecteur * 16 + déplacement

    En mode protégé, il s'agit de convertir une adresse virtuelle codée sur 48 bits, en une adresse physique de 32 bits (taille des bus et des registres d'adresses). Le calcul de l'adresse physique est différent selon que le mécanisme de pagination est ou n'est pas activé. Il est effectué par l'unité de gestion mémoire implantée dans le microprocesseur. Cette unité est elle-même composée d'une unité de segmentation et d'une unité de pagination.

    La première phase de calcul est effectuée par l'unité de segmentation, qui transforme l'adresse virtuelle en adresse linéaire de 32 bits. On peut schématiser le calcul de la façon suivante
 
adresse_linéaire :=
        table_des_descripteurs [i, sélecteur].adresse_de_base + déplacement

    Ici, l'indice i désigne soit la table locale (LDT) soit la table globale (GDT), dont on extrait le champ "adresse_de_base" de l'élément d'index "sélecteur" (figure ci-dessous) :


Calcul de l'adresse linéaire à partir de l'adresse virtuelle

   Si le mécanisme de pagination n'est pas utilisé, l'adresse linéaire est l'adresse physique. Dans le cas contraire, l'adresse linéaire est confiée dans une seconde étape de calcul à l'unité de pagination. Elle est alors décomposée selon les champs suivants (figure ci-dessous) :


Structure de l'adresse linéaire
    En cas de pagination, l'adresse physique est donc calculée par :
 
répertoire_page       := CR3;
table_des_pages       :=
        répertoire_pages [adresse_linéaire.index_répertoire_pages].adresse;
adresse_page_physique :=
        table_des_pages  [adresse_linéaire.index_table_pages].adresse;
adresse_physique      := adresse_page_physique + déplacement;

    La figure ci-dessous illustre le calcul de l'adresse physique à partir de l'adresse linéaire :


Calcul de l'adresse physique

    Comme nous l'avons vu plus haut pour le registre GDTR, le registre CR3 est chargé avec une nouvelle valeur à chaque commutation de contexte, permettant d'accéder à un ensemble de pages physiques disjoint du précédent. Comme on le voit, à une même adresse linéaire correspondent des adresses physiques différentes selon les répertoires et tables de pages utilisés. Inversement, il est possible de faire partager à des activités (tâches) des ressources de mémoire physique (des pages physiques), en donnant au registre CR3 une même valeur. Il faut aussi noter que le registre CR3 est un registre du processeur, et à ce titre une ressource commune à tous les processus, mais que la valeur qui y est chargée est locale au processus actif, ce qui signifie que son espace d'adressage physique est privé (sauf en cas de partage voulu de la mémoire).

Page prec   Début page   Page suiv.