duda conceptual: segmentacion

28/01/2004 - 20:28 por jose antonio | Informe spam
Hola,

tengo una duda conceptual, a ver si alguien me puede aclarar algo.

Se dice que un procesador utiliza un sistema de memoria segmentado, como el
intel 386, cuando los programas se dividen en segmentos (código, datos,
pila, etc). También se afirma que la segmentación es visible al programador
(no así la paginación).

Sin embargo, cuando programo algo (en C por ejemplo), no veo esa división en
segmentos por ningún lado. Tampoco me dan la posibilidad de crear los
segmentos ¿Acaso lo hace el compilador, linker o el SO automáticamente? si
así fuera, ¿en qué se basa para crear los segmentos?

Gracias,
Jose Antonio Feijoo
 

Leer las respuestas

#1 Ramón Sola [MVP Windows]
29/01/2004 - 06:37 | Informe spam
En los lenguajes de alto nivel, los conceptos de bajo nivel quedan bajo la responsabilidad del compilador, no del programador. En cambio, si programas en ensamblador debes tener muy en cuenta dichos conceptos.
Un compilador de alto nivel mete las variables estáticas y globales del programa en un segmento de datos (pues las locales se crean y se destruyen en la pila), las funciones y procedimientos en un segmento de código, y define un segmento de pila de un tamaño determinado, habitualmente configurable.
Algunos compiladores de C, principalmente para DOS, permiten establecer segmentos definidos por el programador, ya sea mediante opciones de línea de comandos o del entorno de programación, o a través de directivas "pragma".

En el caso de un programa preparado para un entorno en modo protegido de 32 bits, ya sea Windows, Linux, otros sistemas operativos de 32 bits o un "extensor" de modo protegido de 32 bits para MS-DOS, los segmentos no tienen demasiado sentido. El entorno se encarga del "trabajo sucio", y el programa sólo "ve" un espacio de direcciones plano, en el que cualquier dirección virtual de memoria se puede expresar utilizando solamente desplazamientos.
En formatos de programa ejecutable como PE (usado en Windows) o ELF (usado en Linux), basados en el formato COFF, se puede observar que el código y los datos están separados de forma "lógica" en secciones. Bueno, eso sirve para que el cargador del sistema sepa cómo asignar los correspondientes parámetros de ejecución: Si es una sección "paginable", si contiene datos inicializados o sin inicializar, si es compartida, si contiene código, si se puede leer, escribir y/o ejecutar...
Ramón Sola, Málaga (España) / MVP Windows - Shell/User
(yanoseashooligan -> yahoo)
Se procura que los consejos y procedimientos dados sean válidos y
seguros desde el punto de vista técnico. No obstante, declino toda
responsabilidad sobre su uso, ya sea beneficioso o malicioso.

Ramón robó pan de la casa de San Juan. -¿Quién, yo? -Sí, tú. -Yo no fui.
-¿Entonces quién? -jose antonio ().
Hola,

tengo una duda conceptual, a ver si alguien me puede aclarar algo.

Se dice que un procesador utiliza un sistema de memoria segmentado, como el
intel 386, cuando los programas se dividen en segmentos (código, datos,
pila, etc). También se afirma que la segmentación es visible al programador
(no así la paginación).

Sin embargo, cuando programo algo (en C por ejemplo), no veo esa división en
segmentos por ningún lado. Tampoco me dan la posibilidad de crear los
segmentos ¿Acaso lo hace el compilador, linker o el SO automáticamente? si
así fuera, ¿en qué se basa para crear los segmentos?

Gracias,
Jose Antonio Feijoo

Preguntas similares