Segment de dades
En informàtica, un segment de dades (sovint indicat com .data ) és una part d'un fitxer objecte o l'espai d'adreces corresponent d'un programa que conté variables estàtiques inicialitzades, és a dir, variables globals i variables locals estàtiques. La mida d'aquest segment ve determinada per la mida dels valors del codi font del programa i no canvia en temps d'execució.[1]
El segment de dades és de lectura/escriptura, ja que els valors de les variables es poden alterar en temps d'execució. Això contrasta amb el segment de dades de només lectura (rodata segment o .rodata ), que conté constants estàtiques en lloc de variables; també contrasta amb el segment de codi, també conegut com a segment de text, que és només de lectura en moltes arquitectures. Les dades no inicialitzades, tant variables com constants, es troben al segment BSS.
Històricament, per poder suportar espais d'adreces de memòria més grans del que permetria la mida nativa del registre d'adreces internes, les primeres CPU van implementar un sistema de segmentació pel qual emmagatzemarien un petit conjunt d'índexs per utilitzar-los com a compensacions a determinades àrees. La família de CPU Intel 8086 va proporcionar quatre segments: el segment de codi, el segment de dades, el segment de pila i el segment addicional. Cada segment es va col·locar en una ubicació específica de la memòria pel programari que s'està executant i totes les instruccions que operaven amb les dades d'aquests segments es van realitzar en relació a l'inici d'aquest segment. Això va permetre que un registre d'adreces de 16 bits, que normalment podria accedir a 64 KB d'espai de memòria, accedir a 1 MB d'espai de memòria.
Aquesta segmentació de l'espai de memòria en blocs discrets amb tasques específiques traslladades als llenguatges de programació del dia i el concepte encara s'utilitza àmpliament als llenguatges de programació moderns.[2]
Memòria del programa
[modifica]La memòria d'un programa d'ordinador es pot classificar en gran part en dues seccions: només lectura i lectura/escriptura. Aquesta distinció va créixer a partir dels primers sistemes que mantenien el seu programa principal en memòria de només lectura com ara Mask ROM, EPROM, PROM o EEPROM. A mesura que els sistemes es van fer més complexos i els programes es van carregar des d'altres mitjans a la memòria RAM en lloc d'executar-se des de la ROM, es va mantenir la idea que algunes parts de la memòria del programa no s'havien de modificar. Aquests es van convertir en els segments .text i .rodata del programa, i la resta que es podia escriure en una sèrie d'altres segments per a tasques específiques.[3]
Codi
[modifica]El segment de codi, també conegut com a segment de text, conté codi executable i, en general, és només de lectura i de mida fixa.
Dades
[modifica]El segment de dades conté variables estàtiques inicialitzades, és a dir, variables globals i variables estàtiques locals que tenen un valor definit i es poden modificar. Alguns exemples en C inclouen:
int i = 3;
char a[] = "Hello World";
static int b = 2023; // Initialized static global variable
void foo (void) {
static int c = 2023; // Initialized static local variable
}
BSS
[modifica]El segment BSS conté dades estàtiques no inicialitzades, tant variables com constants, és a dir, variables globals i variables estàtiques locals que estan inicialitzades a zero o que no tenen inicialització explícita al codi font. Alguns exemples en C inclouen:
static int i;
static char a[12];
Heap
[modifica]El segment d'emmagatzematge dinàmic conté memòria assignada dinàmicament, comença habitualment al final del segment BSS i a partir d'aquí creix a adreces més grans. Està gestionat per malloc, calloc, realloc i free, que poden utilitzar les trucades del sistema brk i sbrk per ajustar la seva mida (tingueu en compte que l'ús de brk/sbrk i un únic segment d'heap no és necessari per complir el contracte de malloc/ calloc/realloc/free; també es poden implementar mitjançant mmap /munmap per reservar/desreservar regions potencialment no contigües de memòria virtual a l'espai d'adreces virtuals del procés). El segment de pila el comparteixen tots els fils, biblioteques compartides i mòduls carregats dinàmicament en un procés.
Pila
[modifica]El segment de pila conté la pila de trucades, una estructura LIFO, que normalment es troba a les parts superiors de la memòria. Un registre de "punter de pila" fa un seguiment de la part superior de la pila; s'ajusta cada vegada que s'"empeny" un valor a la pila. El conjunt de valors empès per a una trucada de funció s'anomena "marc de pila". Una trama de pila consta com a mínim d'una adreça de retorn. Les variables automàtiques també s'assignen a la pila.[4]
Referències
[modifica]- ↑ «Memory Segment - Data Segment (DS) - (ES, FS, GS)» (en anglès), 06-01-2019. [Consulta: 18 setembre 2023].
- ↑ «6: MIPS Memory - the Data Segment» (en anglès), 26-06-2020. [Consulta: 18 setembre 2023].
- ↑ TylerMSFT. «data_seg pragma» (en anglès americà), 03-08-2021. [Consulta: 18 setembre 2023].
- ↑ Kumar, Krishan. «Memory Layout of C Program. Code Data BSS Stack Heap Segments» (en anglès). [Consulta: 18 setembre 2023].