2011-03-03 107 views
5

Estoy leyendo un texto sobre el lenguaje C en la url https://cs.senecac.on.ca/~btp100/pages/content/compu.html. En la sección "Segmentación", dice: "Una técnica lógica para administrar el direccionamiento de un gran número de bytes es la segmentación. La segmentación distingue ciertas regiones de la memoria de otras regiones. Por ejemplo, un sistema operativo almacena información del programa en segmentos dedicados . " enter image description hereSegmentación de la memoria en el lenguaje C

No lo entiendo del todo.

Por ejemplo, si tengo el siguiente programa:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int x = 4; 
    int y = 5; 
    printf("%d\n", x+y); 
    system("PAUSE"); 
    return 0; 
} 

Por lo tanto, lo que se almacena en el segmento de código, lo que en los datos del segmento, y lo que en Pila? Por favor.

Muchas gracias

+4

¿Estás seguro de que necesitas saber esto? Los segmentos eran importantes hace 25 años para los sistemas operativos de 16 bits, pero hoy son totalmente irrelevantes. –

+1

1+, no es totalmente irrelevante, pero ciertamente no es relevante en el mismo sentido que para los sistemas de 16 bits. – 0xC0000022L

+1

Por cierto, esto es tarea, ¿verdad? Usa la etiqueta de tarea. – ThomasMcLeod

Respuesta

4

La pila es sus variables locales (como xey). El segmento de código es para el código binario que realmente se ejecuta. Finalmente, el segmento de datos es para los valores que utiliza su programa (como la cadena PAUSE).

+0

Esto no es técnicamente correcto en el sentido de "C estándar". Puede ser cierto en algunas (o incluso en la mayoría de las plataformas), pero no es necesario ni siquiera usar una pila para la implementación. –

+0

@RandyHoward: Tiene razón, pero hice un juicio sobre la profundidad de mi respuesta en función de la profundidad percibida de la pregunta. Dejo que la votación y los comentarios como el tuyo apoyen o corrijan mi respuesta general. –

2

Depende del compilador. pero, en general, y suponiendo que tiene un sistema operativo que realmente utiliza la segmentación, sus variables locales x y y están referenciadas a SS, sus literales de cadena "% d \ n" y "PAUSA" están referenciados a DS y su código ensamblado real es referencia a CS.

0

Esta pregunta es específica del sistema. Los descriptores de segmento también se usan en Windows de 32 bits, por ejemplo, pero para otros fines que tradicionalmente en los sistemas de 16 bits donde se necesita una segmentación para referirse a las diferentes áreas de memoria simultáneamente.

Los sistemas de 32 bits cuando se utiliza un tipo de puntero ancho de 32 bits pueden abordar el espacio de direcciones virtuales completo, por lo que fs en Windows tiene la clave para estructuras especiales como TEB y PEB. Sin embargo, en el sentido estricto con un modelo de memoria plana no hay necesidad de los registros de segmento.

Ejemplos (Windows-específico, de 32 bits):

mov eax, dword ptr fs:[18h] ; pointer to TEB 
mov eax, dword ptr fs:[30h] ; pointer to PEB 

En muchos sistemas modernos cs y ds se referirán a la misma zona, por ejemplo.

Cuestiones relacionadas