stringtranslate.com

Segmento de datos

En informática , un segmento de datos (a menudo denominado .data ) es una parte de un archivo de 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 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 y 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 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 para usarlos como desplazamientos hacia 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 colocaba en una ubicación específica en la memoria por el software que se ejecutaba y todas las instrucciones que operaban sobre los datos dentro de esos segmentos se realizaban 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, accediera a 1 MB de espacio 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 todavía se utiliza ampliamente en los lenguajes de programación modernos.

Memoria del programa

La memoria de un programa informático se puede clasificar en dos grandes secciones: de solo lectura y de lectura/escritura. Esta distinción surgió a partir de los primeros sistemas que guardaban su programa principal en una memoria de solo lectura, como Mask ROM , EPROM , PROM o 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 otros 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 el diseño típico de la memoria de un programa de computadora simple con el texto, varios datos y secciones de 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:

int estático i ; char 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 hasta alcanzar direcciones más grandes a partir de allí. 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 solo segmento de montón no es necesario para cumplir con el contrato de malloc/calloc/realloc/free; también se pueden implementar usando mmap /munmap para reservar/desreservar regiones potencialmente no contiguas de memoria virtual en el espacio de direcciones virtuales del proceso ). El segmento de montón es compartido por todos los subprocesos, bibliotecas compartidas y módulos cargados dinámicamente en un proceso.

Pila

El segmento de pila contiene la pila de llamadas , una estructura LIFO , que normalmente se encuentra en las partes más altas 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 la pila. El conjunto de valores introducidos 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 segmento de pila tradicionalmente se unía al segmento de montón y crecían uno hacia el otro; cuando el puntero de pila se encontraba con el puntero de montón, se agotaba la memoria libre. Con espacios de direcciones grandes 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, 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 función 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 inicio del segmento de datos. Solo se ejecuta el contenido anterior a esta línea, y el contenido del archivo fuente después de 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. ^ Rubí: Objeto: __END__

Enlaces externos