← Gestión de Memoria Bloque 3 · Asignación contigua · Tema 11 de 52

Tema 11

Registros base y límite

Antes de la paginación, la forma más simple de reubicar y proteger un proceso era usar dos registros del procesador: una base que se suma a cada dirección lógica y un límite que se comprueba en cada acceso. En este tema verás cómo funciona, por qué resuelve la reubicación y la protección, y cuáles son sus limitaciones. Es el punto de partida de la asignación contigua.

1. El problema: reubicar y proteger

Cuando varios programas comparten la RAM, hay que resolver dos cosas (tema 1):

La solución más simple es tratar el proceso como un bloque contiguo en la RAM y usar dos registros: uno con la dirección donde empieza el bloque (base) y otro con su tamaño (límite).

2. La idea: base y límite

El proceso se carga en un bloque contiguo de memoria física, entre la dirección base y base + límite. El procesador tiene dos registros especiales:

El programa sigue usando direcciones lógicas a partir de 0. En cada acceso, el hardware suma la base y comprueba el límite. Es la forma más sencilla de reubicación y protección.

Registros base y límite son dos registros del procesador que definen el rango de memoria física asignado a un proceso: base es la dirección de inicio, límite es el tamaño. En cada acceso se traduce la dirección lógica sumando la base y se comprueba que no supere el límite.

3. Traducción y comprobación

Para cada acceso a memoria con dirección lógica d:

  1. Comprobar: si d ≥ límite, el acceso es ilegal → excepción (protección).
  2. Traducir: dirección física = base + d.
  3. Acceder: la RAM responde con el byte en esa posición física.

Todo esto ocurre en hardware, en cada acceso, sin intervención del sistema operativo. El SO solo carga los registros base y límite al cambiar de proceso (context switch).

Traducción con base y límite: la dirección lógica se comprueba y se suma la base Programa d = 0x100 Hardware si d < límite: física = base + d RAM física base + 0x100 Registros base = 0x10000 límite = 0x5000
La dirección lógica se comprueba contra el límite y se traduce sumando la base. Si supera el límite, se lanza una excepción de protección.

4. Registros en el hardware

En arquitecturas clásicas (y en algunos sistemas embebidos actuales), los registros base y límite son parte del procesador:

En x86 moderno no se usan registros base y límite puros para la memoria principal: se usa segmentación (tema 15) y paginación (tema 18). Pero el concepto sigue presente en sistemas embebidos y en la memoria de E/S mapeada.

5. Ejemplo numérico

Un proceso se carga en la RAM a partir de la dirección física 0x10000 y ocupa 0x5000 bytes (20 KiB). Entonces:

Dirección lógica¿Dentro del límite?Dirección físicaResultado
0x0000Sí (0 < 0x5000)0x10000Acceso válido
0x1000Sí0x11000Acceso válido
0x4FFFSí (último byte)0x14FFFAcceso válido
0x5000No (igual al límite)—Excepción de protección
0xFFFFNo—Excepción de protección

El límite es exclusivo: las direcciones válidas son 0 a límite-1.

6. Ventajas

7. Limitaciones

Estas limitaciones motivaron la segmentación (tema 15) y la paginación (tema 18).

8. Experimento en C

El programa siguiente simula en software la traducción con base y límite:

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

typedef struct { unsigned long base; unsigned long limite; } Contexto;

static unsigned long traducir(Contexto *c, unsigned long logica, int *ok)
{
    if (logica >= c->limite) { *ok = 0; return 0; }
    *ok = 1;
    return c->base + logica;
}

int main(void)
{
    Contexto c = { .base = 0x10000, .limite = 0x5000 };
    unsigned long direcciones[] = { 0x0000, 0x1000, 0x4FFF, 0x5000, 0xFFFF };
    for (int i = 0; i < 5; i++) {
        int ok;
        unsigned long f = traducir(&c, direcciones[i], &ok);
        printf("logica 0x%04lx -> %s 0x%04lx\n",
               direcciones[i], ok ? "fisica" : "EXCEPCION", f);
    }
    return 0;
}
terminal · traducción con base y límite
$ gcc -std=c17 -Wall -Wextra -o base_limite base_limite.c
$ ./base_limite
logica 0x0000 -> fisica 0x10000
logica 0x1000 -> fisica 0x11000
logica 0x4fff -> fisica 0x14fff
logica 0x5000 -> EXCEPCION
logica 0xffff -> EXCEPCIONlogica 0xffff -> EXCEPCION

9. Probar con un simulador

Este simulador traduce direcciones lógicas a físicas usando base y límite. Cambia la base, el límite y la dirección lógica, y observa si el acceso es válido y cuál es la dirección física resultante.

Simulador · base y límite

CampoValor
¿Dentro del límite?
Dirección física
Rango válido

10. En Linux hoy

Linux no usa registros base y límite puros para la memoria principal: usa paginación. Pero el concepto sigue presente en:

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué hace el registro base?

Se suma a la dirección lógica para obtener la dirección física. Define dónde empieza el proceso en la RAM.

2. ¿Qué hace el registro límite?

Define el tamaño del espacio del proceso. Si la dirección lógica es mayor o igual al límite, el acceso es ilegal.

3. ¿Cuál es la fórmula de traducción?

Dirección física = base + dirección lógica, siempre que dirección lógica < límite.

4. ¿Qué ocurre si una dirección lógica supera el límite?

Se lanza una excepción de protección (trap), y el sistema operativo puede terminar el proceso.

5. ¿Por qué base y límite no permiten memoria virtual?

Porque el proceso debe caber entero en un bloque contiguo de RAM; no se puede cargar solo una parte ni usar el disco.

6. ¿Qué es la fragmentación externa?

Los huecos libres que quedan entre procesos cargados y que no son suficientemente grandes para un proceso nuevo, aunque la memoria libre total sea suficiente.

7. ¿Los registros base y límite se usan en x86-64 moderno?

No para la memoria principal (se usa paginación), pero el concepto sigue en la segmentación y en sistemas embebidos.

8. ¿Quién carga los registros base y límite?

El sistema operativo, al cambiar de proceso (context switch). El programa de usuario no puede modificarlos.

Para practicar

  1. Modifica base_limite.c para aceptar base, límite y dirección como argumentos de línea de comandos.
  2. Calcula a mano la dirección física para base=0x20000, límite=0x8000, dirección lógica=0x7FFF. ¿Es válida?
  3. ¿Qué dirección lógica máxima es válida para límite=0x1000? ¿Y la mínima inválida?
  4. Implementa en C una función que simule base y límite para un array de accesos y cuente los válidos e inválidos.
  5. Investiga qué registros de segmentación usa x86 (CS, DS, SS, ES, FS, GS) y qué base/límite tienen en modo 64 bits.
  6. Explica con tus palabras por qué base y límite no permiten compartir código entre procesos.
  7. Compara base y límite con la paginación: ¿qué problema resuelve la paginación que base y límite no?