Pages : 1
#1 Le 19/09/2011, à 20:14
- ehmicky
[Résolu][x86]Segmentation mémoire
Salut à tous,
Je suis en train de me plonger dans les questions de segmentation et de paging x86 de manière générale, et parfois de Linux en particulier.
Donc le schéma que je comprend pour l'instant est (en mode protected avec le paging activé et sans PAE) :
Segmentation :
1) on a une adresse logique (par exemple cs:0x804530)
2) cs désigne un descripteur de segment, qui indique les propriétés du segments mais aussi son adresse de base
3) cette adresse de base + offset (0x804530) donne l'adresse linéaire.
Paging :
4) l'adresse linéaire est divisé en 3 parties :
- la dernière est l'index d'un page directory (dont la base adresse est dans le registre cr3), ce qui permet d'obtenir (entre autres choses) la base adresse d'une page table.
- la seconde est l'index dans cette page table d'une page de 4Ko, dont on obtient donc (entre autres choses) son emplacement dans la mémoire physique.
- la troisième est l'offset, qui ajouté à l'emplacement de la page, donne l'adresse physique finale.
Maintenant ma question : lorsque je regarde via gdb ou readelf, j'obtiens toujours les mêmes choses pour tous les programmes : le code segment commence à 0x804000, et cs vaut 0x73. Ce que je comprends pas, c'est que si c'est effectivement cette adresse logique qui est utilisée runtime, alors tous les programmes utilisent la même entrée de la GDT, et la même page ! (à savoir ici avec 0x804000 : la page à l'index 1 de la page table à l'index 1 du page directory). J'imagine donc que le loader ld doit modifier ces adresse logiques pendant le loadtime, afin de pointant vers des page table différents ! Comment tout cela se passe-t-il ? Quelqu'un aurait-il des infos dessus ? Merci
Dernière modification par ehmicky (Le 29/09/2011, à 04:26)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#2 Le 20/09/2011, à 16:53
- Uda
Re : [Résolu][x86]Segmentation mémoire
Salut,
Je pense que la lecture des articles suivants qui décrivent la réalisation d'un OS (32bits en mode protégé) nommée SOS devrait t'en dire plus.
http://sos.enix.org/
A+
Dernière modification par Uda (Le 20/09/2011, à 16:54)
Hors ligne
#3 Le 20/09/2011, à 20:36
- ehmicky
Re : [Résolu][x86]Segmentation mémoire
Wow, ça c'est de la bonne doc', je sens que je vais tout lire même ce qui concerne pas ma question initiale. Merci
Moi qui pensait il y a plusieurs années que je m'intéresserais jamais au kernel et tout ça, c'est en fait super intéressant
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#4 Le 29/09/2011, à 04:25
- ehmicky
Re : [Résolu][x86]Segmentation mémoire
Donc après lecture : chaque processus a son propre espace d'adressage (sauf pour la mémoire partagée, comme les bibliothèques partagées).
Sous x86, lors d'un changement de tâche (et donc de processus), le registre cr3 change, ce qui modifie les pages traduisant l'adresse linéaire vers l'adresse physique. Du coup, tous les processus ont plus ou moins la même adresse virtuelle sous gdb en effet, mais lors de l'exécution, ces adresses pointent vers des adresses physiques différentes ! Problème résolu, merci
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne