Articulo de referencia

Segmento de datos

En informática , un segmento de datos (a menudo denominado .data ) es una porción de un archivo objeto o del espacio de direcciones correspondiente de un programa que contiene v...

En informática , un segmento de datos (a menudo denominado .data ) es una porción de un archivo objeto o del 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 viene determinado por el tamaño de los valores en el código fuente del programa y no cambia durante la ejecución .

El segmento de datos es de lectura/escritura, ya que los valores de las variables pueden modificarse en tiempo de ejecución. Esto contrasta con el segmento de datos de solo lectura (El segmento .rodata (o.rodata) 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 elsegmento.bss

Históricamente, para admitir espacios de direcciones de memoria mayores que el tamaño nativo del registro de direcciones interno, las primeras CPU implementaron un sistema de segmentación mediante el cual almacenaban un pequeño conjunto de índices que se utilizaban como desplazamientos a ciertas áreas. La familia de CPU Intel 8086 proporcionaba cuatro segmentos: el segmento de código, el segmento de datos, el segmento de pila y el segmento adicional. Cada segmento se ubicaba en una posición específica de la memoria mediante el software que se ejecutaba, y todas las instrucciones que operaban sobre los datos dentro de esos segmentos se ejecutaban con respecto al inicio de dicho segmento. Esto permitía que un registro de direcciones de 16 bits, que normalmente podía acceder a 64  KB de memoria, accediera a 1  MB de memoria.

Esta segmentación del espacio de memoria en bloques discretos con tareas específicas se trasladó a los lenguajes de programación de la época, y el concepto sigue siendo ampliamente utilizado en los lenguajes de programación modernos.

Memoria del programa

La memoria de un programa informático se puede clasificar en dos secciones principales: de solo lectura y de lectura/escritura. Esta distinción surgió de los primeros sistemas, que almacenaban su programa principal en memoria de solo lectura, como la ROM de máscara , la EPROM , la PROM o la EEPROM . A medida que los sistemas se volvieron más complejos y los programas se cargaban desde otros medios a 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. Estas se convirtieron en los segmentos .text y .rodata del programa, y ​​el resto, que podía escribirse, se dividió en varios segmentos para tareas específicas.

Código

El segmento de código , también conocido como segmento de texto , contiene código ejecutable y generalmente es de solo lectura y de tamaño fijo.

Datos

Esto muestra la disposición típica de la memoria de programa de una computadora simple, con las secciones de texto, datos diversos, pila y montón.

El segmento de datos contiene variables estáticas inicializadas, es decir, variables globales y variables estáticas locales que tienen un valor definido y pueden modificarse. Algunos ejemplos en C son:

int i = 3 ; char a [] = "Hola Mundo" ; static int b = 2023 ; // Variable global estática inicializada void foo ( void ) { static int c = 2023 ; // Variable local estática inicializada }

BSS

El segmento BSS contiene datos estáticos no inicializados, tanto variables como constantes, es decir, variables globales y variables estáticas locales que se inicializan a cero o no tienen una inicialización explícita en el código fuente. Algunos ejemplos en C incluyen:

entero estático i ; carácter estático a [ 12 ];

Montón

El segmento de montón contiene memoria asignada dinámicamente, generalmente comienza al final del segmento BSS y crece hacia direcciones mayores a partir de ahí. Es administrado 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 un único segmento de montón no es necesario para cumplir el contrato de malloc/calloc/realloc/free; también pueden implementarse usando mmap /munmap para reservar/liberar regiones de memoria virtual potencialmente no contiguas en el espacio de direcciones virtuales del proceso ). El segmento de montón es compartido por todos los hilos, bibliotecas compartidas y módulos cargados dinámicamente en un proceso.

Pila

El segmento de pila contiene la pila de llamadas , una estructura LIFO ( último en entrar, primero en salir), ubicada normalmente en la parte superior de la memoria. Un registro de puntero de pila rastrea la parte superior de la pila; se ajusta cada vez que se inserta un valor en ella. El conjunto de valores insertados para una llamada a 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.

Tradicionalmente, la pila se ubicaba junto al montón y ambos crecían uno hacia el otro; cuando el puntero de la pila coincidía con el del montón, la memoria libre se había agotado. Con espacios de direcciones amplios y técnicas de memoria virtual, tienden a ubicarse con mayor libertad, pero aún así suelen crecer 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, se encuentran en direcciones numéricamente más bajas y más cerca del montón. En otras arquitecturas, crece en la dirección opuesta.

Lenguas interpretadas

Algunos lenguajes interpretados ofrecen una funcionalidad similar para el segmento de datos, especialmente Perl [ 1 ] y Ruby [ 2 ] . En estos lenguajes, la inclusión de la línea __DATA__(Perl) o __END__(Ruby, Perl antiguo) marca el final del segmento de código y el comienzo del segmento de datos. Solo se ejecuta el contenido anterior a esta línea, y el contenido del archivo fuente posterior a esta línea está disponible como un objeto de archivo: PACKAGE::DATAen Perl (por ejemplo, main::DATA) y DATAen Ruby. Esto puede considerarse una forma de documento here (un literal de archivo).

Véase también

Referencias

  1. perldata: Literales especiales
  2. Ruby: Datos incrustados:
  • "Inicio en C" . bravegnu.org .
  • "mem_sequence.c - lista secuencialmente las regiones de memoria en un proceso" . Archivado del 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.  119 y siguientes.