← Gestión de Memoria Bloque 4 · Segmentación · Tema 17 de 52

Tema 17

Simulador de segmentación

En este tema unimos la traducción (tema 15) y la protección (tema 16) en un simulador interactivo: una tabla de segmentos editable, direcciones lógicas que se traducen paso a paso, y la posibilidad de provocar fallas de protección. Al terminar podrás predecir, para cualquier dirección lógica, si se traduce correctamente o genera SIGSEGV.

1. Qué vamos a simular

El simulador tiene una tabla de segmentos con 4 entradas. El usuario puede:

2. El programa de ejemplo

Este programa en C simula la traducción y protección con segmentación, incluyendo varios casos de falla:

seg_sim.c
#include <stdio.h>

typedef struct { unsigned long base, limite; int r, w, x; } Seg;

static const char *traducir(Seg *t, int s, unsigned long off, unsigned long *fis)
{
    if (s < 0 || s >= 4) return "segmento inexistente";
    if (off >= t[s].limite) return "desplazamiento fuera de rango";
    if (!t[s].r) return "sin permiso de lectura";
    *fis = t[s].base + off;
    return NULL;
}

int main(void)
{
    Seg t[4] = {
        {0x10000, 0x3000, 1, 0, 1},  /* código */
        {0x20000, 0x2000, 1, 1, 0},  /* datos */
        {0x30000, 0x1000, 1, 1, 0},  /* pila */
        {0x00000, 0x0000, 0, 0, 0}   /* sin usar */
    };
    struct { int s; unsigned long off; } casos[] = {
        {0, 0x0500}, {0, 0x3000}, {1, 0x1FFF}, {2, 0x0FFF}, {3, 0x0000}, {5, 0x0000}
    };
    for (int i = 0; i < 6; i++) {
        unsigned long f;
        const char *err = traducir(t, casos[i].s, casos[i].off, &f);
        if (err) printf("seg %d off 0x%04lx -> SIGSEGV (%s)\\n", casos[i].s, casos[i].off, err);
        else printf("seg %d off 0x%04lx -> fisica 0x%05lx\\n", casos[i].s, casos[i].off, f);
    }
    return 0;
}
terminal · traducción y fallas
$ gcc -std=c17 -Wall -Wextra -o seg_sim seg_sim.c
$ ./seg_sim
seg 0 off 0x0500 -> fisica 0x10500
seg 0 off 0x3000 -> SIGSEGV (desplazamiento fuera de rango)
seg 1 off 0x1fff -> fisica 0x21fff
seg 2 off 0x0fff -> fisica 0x30fff
seg 3 off 0x0000 -> SIGSEGV (segmento inexistente)
seg 5 off 0x0000 -> SIGSEGV (segmento inexistente)

3. La tabla de segmentos editable

La tabla tiene 4 entradas. Cada una tiene base, límite y permisos (r, w, x). El usuario puede modificar cualquier campo para experimentar.

4. Traducción paso a paso

Para una dirección lógica (s, d):

  1. Validar el segmento: s debe estar entre 0 y 3. Si no, falla.
  2. Comprobar el desplazamiento: d debe ser menor que el límite. Si no, falla.
  3. Comprobar permisos: el modo de acceso (lectura/escritura/ejecución) debe estar permitido.
  4. Traducir: dirección física = base[s] + d.

5. Provocar fallas de protección

Se pueden provocar fallas de distintos tipos:

6. El simulador interactivo

Memoria de segmentos editable. Introduce una dirección lógica y observa la traducción o la falla.

Simulador · segmentación completa

CampoValor
Base
Límite
Permisos
¿Segmento válido?
¿Dentro del límite?
¿Permiso concedido?
Resultado
Dirección física

Tabla de segmentos (editable):

7. Qué observar

8. Limitaciones del simulador

Este simulador es una simplificación. No modela:

9. En Linux hoy

En Linux moderno, la segmentación se usa de forma plana y la protección se hace por páginas. Pero los conceptos siguen:

10. Resumen

11. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué fallas se pueden provocar en el simulador?

Segmento inválido, desplazamiento fuera de rango y permiso denegado.

2. ¿Cómo se edita la tabla de segmentos?

Cambiando los campos base, límite y permisos (r, w, x) de cada segmento.

3. ¿Qué ocurre si el límite es 0?

Cualquier desplazamiento (≥ 0) supera el límite, por lo que todo acceso falla.

4. ¿Qué diferencia hay entre una falla por rango y una por permiso?

La de rango es por desplazamiento ≥ límite; la de permiso es porque el modo de acceso no está permitido.

5. ¿Por qué el simulador no modela niveles de privilegio?

Por simplicidad: los niveles (DPL, RPL) son propios de x86 y añadirían complejidad.

6. ¿Qué significa que un segmento tenga permisos r-x?

Se puede leer y ejecutar, pero no escribir. Es típico del código.

7. ¿Cómo se relaciona este simulador con SIGSEGV?

Cada falla del simulador corresponde a una SIGSEGV en un sistema real.

8. ¿Qué herramienta de Linux muestra las regiones como segmentos?

/proc/PID/maps, que lista las regiones con sus permisos y origen.

Para practicar

  1. Configura el segmento 0 con base 0x10000 y límite 0x1000. Traduce (0, 0x0FFF) y (0, 0x1000). ¿Cuál falla?
  2. Cambia los permisos del segmento 1 a r-- (solo lectura) y evalúa (1, 0x0000, 'w'). ¿Qué falla?
  3. Añade un segmento 4 con base 0x40000 y límite 0x2000. Modifica el simulador para soportarlo.
  4. Traduce (0, 0x0500) con base 0x20000. ¿Cuál es la física?
  5. Explica por qué un segmento con límite 0 es útil (segmento sin usar).
  6. Compara el simulador con el de segmentación (tema 15): ¿qué añade este?
  7. Investiga cómo el ELF define los segmentos LOAD y sus permisos.