Segment de données
Un segment de données est une portion d’espace d’adressage virtuel d’un programme, qui contient les variables globales et les variables statiques qui sont initialisées par le programmeur. Cette portion a une taille fixe pour chaque programme, qui dépend de son contenu, dans la mesure où toutes les données sont affectées par le programmeur avant le chargement du programme.
Noter que le segment de données n’est pas en lecture seule, puisque les valeurs de ces variables peuvent être altérées à l’exécution. En cela, il s’oppose à la section “Rodata” (« read-only data », données constantes et en lecture seule), tout comme au segment de code.
L’architecture PC prend en charge peu de régions de mémoire avec un accès en lecture-écriture basique pour un programme : la pile, le segment de données et le segment de code.
Mémoire accessible par un programme
modifierLa mémoire d’un programme informatique est divisée ainsi :
- segment de données (données + BSS + tas) ;
- Pile d'exécution, souvent abrégée par "la pile" ;
- segment de code.
Segment de données
modifierLe segment de données contient les variables globales et statiques utilisées par le programme et qui sont initialisées. On peut y distinguer une zone en lecture seule et une zone en lecture-écriture. Par exemple, la chaîne de caractères définie par char s[] = "hello world"
en C et une expression C comme int debug=1
en dehors du “main” seront stockées dans la zone en lecture-écriture ; tandis qu’une expression C telle que const char* string = "hello world"
stocke la chaîne de caractères littérale "hello world"
dans la zone en lecture seule et la variable pointeur de caractère string
dans la zone en lecture-écriture.
Segment BSS
modifierLe segment BSS aussi connu comme zone de données non initialisées commence à la fin du segment de données et contient toutes les variables globales et toutes les variables statiques qui sont initialisées à zéro ou n’ont pas d’initialisation explicite dans le code source. Par exemple, une variable déclarée static int i;
sera « contenue » dans le segment BSS.
Tas
modifierLe tas commence à la fin du segment BSS. Le tas est géré par malloc
, realloc
, et free
, qui peut utiliser les appels système brk et sbrk pour ajuster sa taille. Le tas est partagé par toutes les bibliothèques partagées et tous les modules chargés dynamiquement par un processus.
Pile
modifierLa pile accompagne traditionnellement le tas binaire et augmente dans la direction opposée ; quand le pointeur de pile rencontre le pointeur de tas binaire, la mémoire libre a été épuisée (dans des espaces d’adressage modernes et vastes, et avec les techniques de mémoire virtuelle, ils peuvent se trouver n’importe où, mais vont quand même croître dans deux directions opposées).
La pile est une structure LIFO, généralement située dans la plus haute zone de la mémoire. Un registre de pointeur de pile pointe sur le haut de la pile ; il est modifié à chaque fois qu’une valeur est empilée ou dépilée. L’ensemble des valeurs empilées par un appel à une fonction est appelé une « trame de pile » ; une trame de pile consiste au minimum en une adresse de retour.