Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 smile

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 big_smile


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 smile : 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 wink


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