mardi 8 juillet 2008

[OS]Le mirroring

Suite à l'article précédent, je présente ici une technique de mise en œuvre de la pagination car il nous reste encore un petit problème à régler avant d'activer la pagination qui se fait pas le biais du bit 31 du registre cr0.

La pagination sert à transformer des adresses logiques ( j'appellerais dans la suite adresses logiques les adresses fictives dont j'ai parlé dans l'article précédent car c'est le nom qu'on leur attribut normalement ) en adresses physiques qui correspondent à l'emplacement en RAM. Jusque là il n'y a pas de problème, cependant une fois que la pagination sera activée si nous n'avons pas fait de référence aux PDE et PTE on en pourra pas les modifier et on ne pourra donc pas rajouter/supprimer d'espace mémoire virtuel ce qui est très embêtant car il nous faudra alors allouer toute la mémoire avant de lancer la pagination et bien entendu l'intérêt de la pagination dans ce cas là est bien moindre car on ne pourra pas utilisé tout les principes sous-jacents à la pagination comme le fait de pouvoir utiliser une partition swap ou tout autre espace de stockage en mémoire morte comme un stockage sur un autre pc par le réseau.

Il nous faut donc obligatoirement faire référence aux PDE et PTE, pour cela on pourrait décider qu'un PT qui serait charger de faire référence à tout les autres PTE et aux PDE. Étant donnée qu'il y a 1024 PTE dans un PT et en considérant qu'on n'a pas besoin de modifier le PT qui fait référence aux autres, il nous reste 1023 PT à référencer + le PD, ce qui nous rempli entièrement le PT. Nous pouvons mélanger les PDE avec les PTE car ceux-ci ont une structure similaire, seul deux bits ont une signification différente mais ils sont tout de même "compatible".

Cette solution pourrait être envisageable mais au niveau de l'implémentation, ça serait assez chiant et vous connaissez les programmeurs ils n'aiment pas perdre leur temps et vont toujours au plus rapide même si on perd en lisibilité.


Le mirroring consiste tout simplement à indiquer à un PDE qu'elle doit pointer sur l'adresse de base du PD ( qui est contenu dans cr3 ) et on comprend maintenant le nom de cette technique. Le PDE en question peut être choisi arbitrairement cependant un choix comme la première ou la dernière serait plus "logique" que de choisir n'importe qu'elle entrée au milieu du PD.

Donc voyons ce que ça donne en pratique, lorsque l'on veut modifier un PTE on utilisera comme offset du PDE l'index du mirroring, comme offset du PTE le numéro du PT auquel on veut accéder et on choisira le dernier offset en fonction du PTE qu'on veut modifier. Et lorsque l'on veut modifier un PDE on utilisera comme offset du PDE et du PTE celui de l'index du mirroring comme ça on est redirigé deux fois vers le PD lui même et on se sert de l'offset pour accéder au PDE correspondant. Attention cependant à ne pas modifier l'index du mirroring pour qu'il ne pointe plus vers l'adresse de base du PD sinon tout le système sera court-circuiter et on ne pourra plus modifier ni PDE ni PTE comme précédemment. Afin d'éviter ceci il faut effectuer une petite vérification dans le code.

Voila un petit schéma qui illustre ceci ( je l'ai fait à la main n'étant pas infographiste donc si quelqu'un qui sait utiliser un logiciel de dessin passe par la et qu'il pouvait me faire ceci je lui en serait très reconnaissant ) :

Voici un exemple avec un offset de PD de 1024, un offset de PT de 123 et un offset de page de 673.
Donc on peut voir que le dernier PDE pointe vers la base du PD ( en rouge ), que le PDE pointe vers le PT ( en bleu ) comme d'habitude sauf que ceci se passe à la deuxième indirection et non pas à la première et enfin on accède au PTE en vert avec le dernier offset.

Les deux techniques sont équivalentes en terme de mémoire virtuelle, elles utilisent toutes les deux 4Mo de mémoire virtuelle. Dans le premier cas on utilise 1024 PTE qui pointent chacun normalement sur une page de 4Ko ce qui nous fait bien 4Mo ( 1024*4Ko ) et le mirroring bloque un PDE et donc en même temps libère un PT qui reste inutilisé dans la mémoire physique or un PDE représente la même mémoire virtuelle qu'un PT donc encore 4Mo de mémoire virtuelle.
Cependant la technique du mirroring est bien plus propre, rapide, ingénieuse que la première méthode exposée et de plus elle libère 4Ko dans la mémoire physique.


Et bien voila une bonne chose de faite, en attendant moi je continue de coder mon petit kernel même si le temps me manque pour pouvoir m'investir comme je le voudrais.