[SOS] Pagination (Rapport page_physique <-> page_virtuelle)

Thomas Petazzoni thomas.petazzoni at enix.org
Sam 22 Oct 13:58:39 CEST 2005


Salut,

On Fri, 21 Oct 2005 13:09:42 +0200
"romain" <romain at hexanium.com> wrote:

> J'ai énormement de mal à comprend la pagination, je comprend à peut
> pres l'article 3, la gestion des pages "physiques", par contre quand
> je passe à l'article 4 je suis paumé, c'est pas trop le probleme, ca
> rentrera bien un jour, je vais me refader 10 fois les articles si il
> le faut !

Ne t'inquiètes pas si tu as un peu de mal à comprendre la pagination.
Personnellement, quand j'ai commencé KOS, j'ai mis facilement six mois
avant de vraiment bien maîtriser les tenants et les aboutissants de la
bête. Donc pas d'inquiétude, ça va venir ! ;-)

> 2/ sos_paging_map(ppage_new, vpage_tmp, FALSE, SOS_VM_MAP_ATOMIC |
> SOS_VM_MAP_PROT_READ | SOS_VM_MAP_PROT_WRITE);
> Bon ca je pige pas trop dans le source pour le moment mais j'avais
> compris que la, on "associait" l'adresse virtuelle vpage_tmp à la page
> physique toute neuve récupérée plus haut.

Tout à fait: on « mappe » ou « projette » la page physique d'adresse
ppage_new à l'adresse virtuelle vpage_tmp.

> 3/ Puis vous faite un truc qui me parait "fou":
> sos_physmem_unref_physpage(ppage_new);
> Mais du coup cette page et libre et poura etre reallouée ? Bizard,
> puis qu'on à déjà mappé notre adresse virtuelle vpage_temp dessus.
> Donc quelque part la ressource est en cours d'utilisation, mais la
> page physique ne reflete pas cette etat, du coup si on refait un
> sos_physmem_ref_physpage_new(FALSE); on va se rechopper la meme page !
> (enfin on a des chances...)

Non, car si tu regardes le code de sos_paging_map(), tu verras
l'instruction suivante:

  sos_physmem_ref_physpage_at(ppage_paddr);

Donc dans sos_paging_map(), on incrémente le compteur de référence de
la page physique qu'on vient de mapper.

> 4/ La on utilise la ressources ( o_O ) tjrs bizard la page "physique"
> est cencé etre libre.

Non, cf ci-dessus ;-)

> Est-ce qu'on peut dire que grace au "sos_paging_map" on associe une
> PAGE PHYSIQUE à une PAGE_VIRTUELLE ?

Oui. Comme dis plus haut, sos_paging_map() sert à « mapper » une page
physique à une adresse virtuelle donnée.

> Y'a-t-il d'autres solutions ormis celles exposées dans l'article 4
> (Celle de SOS "Mirroring © Copyright 2002 2005 Sos Workgroup" ou celle
> de linux expliquée) pour que lorqu'on active la pagination
> l'instruction tous de suite apres l'activation (setup cr3 et cr0) se
> trouve dans la bonne page (virtuelle et physique) ? (je comprend rien
> au "Mirroring"...)


Le mirroring n'a pas grand chose à voir avec « lorsqu'on active la
pagination l'instruction tout de suite après se trouve dans la bonne
page ». Le mirroring est une astuce qui permet d'accéder de manière
très simple au répertoire de pages et aux tables de page de l'espace
d'adressage courant.

Le mécanisme le plus simple pour « passer le cap » de la mise en place
de la pagination, c'est l'«identity mapping». C'est expliqué à la
section 2.5 de l'article 4.

Dans KOS, le fonctionnement est un peu différent: le «loader» met en
place un identity mapping, et active la pagination. Ensuite, il charge
tous les modules de KOS en mémoire, en les mappant en dehors de
l'identity mapping. Lorsque le loader a terminé son exécution, il passe
la main à un module spécial appelé « init », qui retire l'identity
mapping: celui-ci n'est plus nécessaire.

(Le loader met en place un identity mapping des 256 premiers Mo de
mémoire virtuelle vers le 256 premiers Mo de mémoire physique. Ensuite,
il charge les modules en les mappant à partir de l'adresse 768 Mo en
mémoire virtuelle. Une fois que le loader a terminé son exécution, on
peut donc virer l'identity mapping).

> Question de base désolé, c'est quoi cette notion de "volatile" ? Quel
> difference entre un "asm" et un "asm volatile" ?

La doc de Gcc ("info gcc") indique:

«
You can prevent an `asm' instruction from being deleted by writing the
keyword `volatile' after the `asm'.  For example:

     #define get_and_set_priority(new)              \
     ({ int __old;                                  \
        asm volatile ("get_and_set_priority %0, %1" \
                      : "=g" (__old) : "g" (new));  \
        __old; })

The `volatile' keyword indicates that the instruction has important
side-effects.  GCC will not delete a volatile `asm' if it is reachable.
(The instruction can still be deleted if GCC can prove that
control-flow will never reach the location of the instruction.)  Note
that even a volatile `asm' instruction can be moved relative to other
code, including across jump instructions.
»

Bonne journée,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org 
http://{thomas,sos,kos}.enix.org - Jabber: thomas.petazzoni at jabber.dk
http://{agenda,livret}dulibre.org
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://the-doors.enix.org/pipermail/sos/attachments/20051022/234d2420/attachment.pgp


Plus d'informations sur la liste de diffusion Sos