Segment de données - Data segment

En informatique , un segment de données (souvent noté .data ) est une partie d'un fichier objet ou l' espace d'adressage correspondant d'un programme qui contient des variables statiques initialisées , c'est-à-dire des variables globales et des variables locales statiques . La taille de ce segment est déterminée par la taille des valeurs dans le code source du programme et ne change pas au moment de l'exécution .

Le segment de données est en lecture/écriture, car les valeurs des variables peuvent être modifiées au moment de l'exécution. Cela contraste avec le segment de données en lecture seule ( rodata segmentou.rodata), qui contient des constantes statiques plutôt que des variables ; il contraste également avec lesegment de code, également connu sous le nom de segment de texte, qui est en lecture seule sur de nombreuses architectures. Les données non initialisées, variables et constantes, se trouvent plutôt dans lesegment BSS.

Historiquement, pour pouvoir prendre en charge des espaces d'adressage mémoire plus grands que la taille native du registre d'adresses interne le permettrait, les premiers processeurs implémentaient un système de segmentation par lequel ils stockaient un petit ensemble d'index à utiliser comme décalages dans certaines zones. La famille de processeurs Intel 8086 fournissait quatre segments : le segment de code, le segment de données, le segment de pile et le segment supplémentaire. Chaque segment a été placé à un emplacement spécifique en mémoire par le logiciel en cours d'exécution et toutes les instructions qui opéraient sur les données dans ces segments ont été exécutées par rapport au début de ce segment. Cela a permis à un registre d'adresses de 16 bits, qui serait normalement capable d'accéder à 64 Ko d'espace mémoire, d'accéder à 1 Mo d'espace mémoire.

Cette segmentation de l'espace mémoire en blocs discrets avec des tâches spécifiques reportées dans les langages de programmation de l'époque et le concept est encore largement utilisé dans les langages de programmation modernes.

Mémoire de programme

Une mémoire de programme informatique peut être en grande partie classée en deux sections : en lecture seule et en lecture/écriture. Cette distinction s'est développée à partir des premiers systèmes contenant leur programme principal en mémoire morte tels que Mask ROM , EPROM , PROM ou EEPROM . Au fur et à mesure que les systèmes devenaient plus complexes et que les programmes étaient chargés à partir d'autres supports dans la RAM au lieu de s'exécuter à partir de la ROM, l'idée que certaines parties de la mémoire du programme ne devaient pas être modifiées a été retenue. Ceux-ci sont devenus les segments .text et .rodata du programme, et le reste qui pouvait être écrit divisé en un certain nombre d'autres segments pour des tâches spécifiques.

Code

Le segment de code , également appelé segment de texte , contient du code exécutable et est généralement en lecture seule et de taille fixe.

Données

Cela montre la disposition typique d'une mémoire de programme d'un ordinateur simple avec le texte, diverses données et sections de pile et de tas.

Le segment de données contient des variables statiques initialisées, c'est-à-dire des variables globales et des variables statiques locales qui ont une valeur définie et peuvent être modifiées. Exemples en C :

int i = 3;
char a[] = "Hello World";

Les valeurs de ces variables sont initialement stockées dans la mémoire morte (généralement dans le segment de code) et sont copiées dans le segment de données pendant la routine de démarrage du programme.

BSS

Le segment BSS contient des données statiques non initialisées, à la fois des variables et des constantes, c'est-à-dire des variables globales et des variables statiques locales qui sont initialisées à zéro ou n'ont pas d'initialisation explicite dans le code source. Exemples en C :

int i;
char a[12];

Tas

Le segment de tas contient de la mémoire allouée dynamiquement, commence généralement à la fin du segment BSS et se développe à partir de là vers des adresses plus grandes. Il est géré par malloc , calloc, realloc et free, qui peuvent utiliser les appels système brk et sbrk pour ajuster sa taille (notez que l'utilisation de brk/sbrk et d'un seul segment de tas n'est pas nécessaire pour remplir le contrat de malloc/ calloc/realloc/free ; ils peuvent également être implémentés à l'aide de mmap /munmap pour réserver/annuler la réservation de régions potentiellement non contiguës de mémoire virtuelle dans l' espace d'adressage virtuel du processus ). Le segment de tas est partagé par tous les threads, bibliothèques partagées et modules chargés dynamiquement dans un processus.

Empiler

Le segment de pile contient la pile d'appels , une structure LIFO , généralement située dans les parties supérieures de la mémoire. Un registre « pointeur de pile » suit le sommet de la pile ; il est ajusté à chaque fois qu'une valeur est "poussée" sur la pile. L'ensemble des valeurs poussées pour un appel de fonction est appelé « trame de pile ». Une trame de pile se compose au minimum d'une adresse de retour. Des variables automatiques sont également allouées sur la pile.

Le segment de pile jouxtait traditionnellement le segment de tas et ils se sont rapprochés l'un de l'autre ; lorsque le pointeur de pile a rencontré le pointeur de tas, la mémoire libre était épuisée. Avec de grands espaces d'adressage et des techniques de mémoire virtuelle, ils ont tendance à être placés plus librement, mais ils se développent toujours généralement dans une direction convergente. Sur l' architecture PC x86 standard , la pile grandit vers l'adresse zéro, ce qui signifie que les éléments les plus récents, plus profonds dans la chaîne d'appel, sont à des adresses numériquement inférieures et plus proches du tas. Sur certaines autres architectures, il pousse dans le sens inverse.

Langues interprétées

Certains langages interprétés offrent une facilité similaire au segment de données, notamment Perl et Ruby . Dans ces langages, y compris la ligne __DATA__(Perl) ou __END__(Ruby, ancien Perl) marque la fin du segment de code et le début du segment de données. Seul le contenu avant cette ligne est exécuté, et le contenu du fichier source après cette ligne est disponible en tant qu'objet fichier : PACKAGE::DATAen Perl (par exemple, main::DATA) et DATAen Ruby. Cela peut être considéré comme une forme de document ici (un littéral de fichier).

Voir également

Les références

Liens externes

  • "C démarrage" . bravegnu.org .
  • "mem_sequence.c - répertorie séquentiellement les régions de mémoire dans un processus" . Archivé de l'original le 2009-02-02.
  • van der Linden, Peter (1997). Programmation experte en C : secrets profonds en C (PDF) . Prentice Hall. p. 119 et suiv.