En informática , un segmento de datos (a menudo denominado .data ) es una parte de un archivo de objeto o el espacio de direcciones correspondiente de un programa que contiene variables estáticas inicializadas , es decir, variables globales y variables locales estáticas . El tamaño de este segmento está determinado por el tamaño de los valores en el código fuente del programa y no cambia en tiempo de ejecución .
El segmento de datos es de lectura / escritura, ya que los valores de las variables se pueden modificar en tiempo de ejecución. Esto contrasta con el segmento de datos de solo lectura (segmento rodata o.rodata), que contiene constantes estáticas en lugar de variables; también contrasta con elsegmento de código, también conocido como segmento de texto, que es de solo lectura en muchas arquitecturas. Los datos no inicializados, tanto variables como constantes, se encuentran en cambio en elsegmento BSS.
Históricamente, para poder admitir espacios de direcciones de memoria más grandes que lo que permitiría el tamaño nativo del registro de direcciones interno, las primeras CPU implementaron un sistema de segmentación mediante el cual almacenarían un pequeño conjunto de índices para usar como compensaciones en ciertas áreas. La familia de CPU Intel 8086 proporcionó cuatro segmentos: el segmento de código, el segmento de datos, el segmento de pila y el segmento adicional. Cada segmento fue colocado en una ubicación específica en la memoria por el software que se estaba ejecutando y todas las instrucciones que operaron en los datos dentro de esos segmentos se realizaron en relación con el inicio de ese segmento. Esto permitió que un registro de direcciones de 16 bits, que normalmente podría acceder a 64 KB de espacio de memoria, tuviera acceso a 1 MB de espacio de memoria.
Esta segmentación del espacio de la memoria en bloques discretos con tareas específicas transferidas a los lenguajes de programación de la época y el concepto todavía se usa ampliamente en los lenguajes de programación modernos.
Programa de memoria
La memoria de un programa de computadora se puede clasificar en gran medida en dos secciones: solo lectura y lectura / escritura. Esta distinción surgió de los primeros sistemas que mantenían su programa principal en una memoria de solo lectura , como Mask ROM , PROM o EEPROM . A medida que los sistemas se volvieron más complejos y los programas se cargaron desde otros medios en la RAM en lugar de ejecutarse desde la ROM, se mantuvo la idea de que algunas partes de la memoria del programa no debían modificarse. Estos se convirtieron en los segmentos .text y .rodata del programa, y el resto en el que se podría escribir se dividió en varios otros segmentos para tareas específicas.
Texto
El segmento de código , también conocido como segmento de texto o simplemente como texto , es donde se almacena una parte de un archivo de objeto o la sección correspondiente del espacio de direcciones del programa que contiene instrucciones ejecutables y generalmente es de solo lectura y de tamaño fijo.
Datos
El segmento .data contiene cualquier variable global o estática que tiene un valor predefinido y se puede modificar. Es decir, las variables que no están definidas dentro de una función (y, por lo tanto, se puede acceder a ellas desde cualquier lugar) o que están definidas en una función, pero están definidas como estáticas, por lo que conservan su dirección en las llamadas posteriores. Los ejemplos, en C, incluyen:
int val = 3; char string [] = "Hola mundo";
Los valores de estas variables se almacenan inicialmente en la memoria de solo lectura (normalmente dentro de .text ) y se copian en el segmento .data durante la rutina de inicio del programa.
Tenga en cuenta que en el ejemplo anterior, si estas variables se hubieran declarado desde dentro de una función, por defecto se almacenarían en el marco de pila local.
BSS
El segmento BSS, también conocido como datos no inicializados , suele ser adyacente al segmento de datos. El segmento BSS contiene todas las variables globales y variables estáticas que se inicializan a cero o no tienen inicialización explícita en el código fuente. Por ejemplo, una variable definida como static int i;
estaría contenida en el segmento BSS.
Montón
El área del montón normalmente comienza al final de los segmentos .bss y .data y crece a direcciones más grandes desde allí. El área del montón es administrada por malloc , calloc, realloc y free, que pueden usar las llamadas al sistema brk y sbrk para ajustar su tamaño (tenga en cuenta que el uso de brk / sbrk y una sola "área del montón" no es necesario para cumplir el contrato de malloc / calloc / realloc / free; también pueden implementarse usando mmap / munmap para reservar / anular la reserva de regiones potencialmente no contiguas de memoria virtual en el espacio de direcciones virtuales del proceso ). El área del montón es compartida por todos los subprocesos, bibliotecas compartidas y módulos cargados dinámicamente en un proceso.
Apilar
El área de la pila contiene la pila de programas , una estructura LIFO , que normalmente se encuentra en las partes superiores de la memoria. Un registro de "puntero de pila" rastrea la parte superior de la pila; se ajusta cada vez que se "empuja" un valor a la pila. El conjunto de valores insertados para una llamada de función se denomina "marco de pila". Un marco de pila consta como mínimo de una dirección de retorno. Las variables automáticas también se asignan en la pila.
El área de la pila tradicionalmente se unía al área de la pila y crecían uno hacia el otro; cuando el puntero de pila se encuentra con el puntero de montón, se agota la memoria libre. Con grandes espacios de direcciones y técnicas de memoria virtual, tienden a colocarse con mayor libertad, pero aún así crecen en una dirección convergente. En la arquitectura estándar de PC x86, la pila crece hacia la dirección cero, lo que significa que los elementos más recientes, más profundos en la cadena de llamadas, están en direcciones numéricamente más bajas y más cerca del montón. En algunas otras arquitecturas crece en la dirección opuesta.
Idiomas interpretados
Algunos lenguajes interpretados ofrecen una facilidad similar al segmento de datos, en particular Perl [1] y Ruby . [2] En estos lenguajes, la línea __DATA__
(Perl) o __END__
(Ruby, antiguo Perl) marca el final del segmento de código y el comienzo del segmento de datos. Solo se ejecutan los contenidos antes de esta línea, y los contenidos del archivo fuente después de esta línea están disponibles como un objeto de archivo: PACKAGE::DATA
en Perl (por ejemplo, main::DATA
) y DATA
en Ruby. Esto se puede considerar una forma de aquí documento (un archivo literal).
Ver también
Referencias
- ^ perldata: Literales especiales
- ^ Ruby: Objeto: __END__
enlaces externos
- "Inicio de C" . bravegnu.org .
- "mem_sequence.c - enumera secuencialmente las regiones de memoria en un proceso" . Archivado desde el original el 2 de febrero de 2009.
- van der Linden, Peter (1997). Programación experta en C: secretos profundos de C (PDF) . Prentice Hall. págs. 119ff.