- 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” (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.
Sommaire
Mémoire accessible par un programme
La mémoire d’un programme informatique est divisée en les parties suivantes :
- Segment de données (Données + BSS + Tas binaire)
- Pile
- segment de code
Segment de données
Le 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 commeint debug=1
en dehors du “main” seront stockées dans la zone en lecture-écriture ; tandis qu’une expression C telle queconst char* string = "hello world"
stocke la chaîne de caractères litérale"hello world"
dans la zone en lecture seule et la variable pointeur de caractèrestring
dans la zone en lecture-écriture.Segment BSS
Le 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 binaire
Le tas binaire commence à la fin du segment BSS. Le tas binaire est géré par
malloc
,realloc
, etfree
, qui peut utiliser les appels système brk et sbrk pour ajuster sa taille. Le tas binaire est partagé par toutes les bibliothèques partagées et tous les modules chargés dynamiquement par un processus.Pile
La 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.
Références
Modèle:Refbegin
Modèle:Refend
Voir aussi
- Segmentation (informatique)
- Édition de liens
- Segment de code
- Segment BSS
- Variable non initialisée
Liens externes
- mem_sequence.c - sequentially lists memory regions in a process
- Expert C Programming: Deep C Secrets, Peter van der Linden, Prentice Hall 1997, p. 119ff
- Understanding Memory
Wikimedia Foundation. 2010.