Je raisonne sur la base d’un processeur i386 / 32 bits.
Je m’intéresse au partage de la mémoire (vision utilisateur) fourni par :
Le segment de text (code) , segment de données initialisées DS, segment de données non initialisées (BSS), et notre chère pile (SS) qui contiendra les variables locales et une partie réservée au TAS. Le tas se situera aux adresses basses de cette pile; je ne vois pas l'intérêt de cette information à l'utilisateur, main bon!
Pouvez vous me confirmer les dires suivants :
Du côté de la gestion mémoire à bas niveau (exécution côté microprocesseur) ; on n’est plus à la vision utilisateur. Il faut raisonner en 3 segments :
Le segment du code CS ( qui contiendra la vision du segment text), le segment DATA (contiendra DS et BSS), la pile (contiendra la vision du SS). Tout cela géré par les pointeurs de piles.
Voila un petit rappel du côté assembleur :
Les registres se classent usuellement en 4 catégories :
1. registres généraux : %eax, %ebx, %ecx et %edx servent à la manipulation de données ;
2. registres de segment :%cs, %ds, %esx et %ss, sur 16 bits, contiennent la première partie d'une adresse en mémoire ;
3. registres d'offset : ils indiquent un décalage (offset) par rapport aux registres de segments :
o %eip (Extended Instruction Pointer) : indique l'adresse de la prochaine instruction à exécuter ;
o %ebp (Extended Base Pointer) : indique le début de l'environnement local d'une fonction ;
o %esi (Extended Source Index) : contient l'offset des données source dans une opération utilisant un bloc mémoire ;
o %edi (Extended Destination Index) : contient l'offset des données destination dans une opération utilisant un bloc mémoire ;
o %esp (Extended Stack Pointer) : le sommet de la pile ;
Mon avis :
La vision fournie à l’utilisateur est très approchée de la réalité par rapport à l’assembleur. La différence réside dans gestion de la pile qui ne respecte pas forcément le partage de cette dernière entre les variables locales (adresses supérieures) et le tas (adresses inférieures)… D’ailleurs, je ne vois pas l’intérêt de fournir à l’utilisateur cette dernière précision encore une fois! peut être qu’il s’agit de limiter le pointage afin de protéger les deux zones...
Il doit certainement exister des instructions (peu importe le langage) qui manipulent des adresses mémoires (utilisateur) qui correspondent à ces zones. Si oui, dans quel but ? sauf pour le tas peut être où il faut faire le ménage régulièrement.
La plage mémoire attribuée à une pile est forcément contigüe sauf si le segment grandit et là je pense que l’OS attribue un espace supplémentaire en utilisant les pointeurs ; pourquoi pas! J’ai dû lire cela quelque part.
Merci d’émettre vos critiques et d’apporter une contribution pour rendre plus claires les choses.
Merci à vous
Partager