← Gestión de Memoria Bloque 5 · Paginación · Tema 23 de 52

Tema 23

Simulador de paginación

En este tema unimos la traducción (tema 19) y las tablas multinivel (tema 22) en un simulador paso a paso: una dirección virtual recorre una tabla de dos niveles hasta llegar al marco físico. Al terminar podrás seguir manualmente el recorrido de cualquier dirección virtual a través de las tablas.

1. Qué vamos a simular

El simulador recibe una dirección virtual y la traduce a física recorriendo una tabla de dos niveles:

El usuario avanza paso a paso y ve en cada nivel qué entrada se consulta y qué valor se obtiene.

2. El programa de ejemplo

Este programa en C simula la traducción con dos niveles (directorio de 4 entradas, tabla de 4 entradas por directorio):

pag2niveles.c
#include <stdio.h>

int main(void)
{
    const int PS = 16;  /* tamaño de página (16 B, para el ejemplo) */
    const int DIR_ENTRIES = 4;
    const int TBL_ENTRIES = 4;

    /* Directorio: índice -> base de tabla */
    int dir[] = {0, 1, -1, -1};  /* -1 = no presente */
    /* Tablas: [dir][tbl] -> marco */
    int tbl[4][4] = {
        {5, 2, -1, -1},
        {8, -1, 3, -1},
        {-1, -1, -1, -1},
        {-1, -1, -1, -1}
    };

    unsigned int vaddr = 0x2B;  /* dirección virtual de ejemplo */
    unsigned int p = vaddr / PS;   /* número de página (0-15) */
    unsigned int d = vaddr % PS;   /* desplazamiento */
    unsigned int dirIdx = p / TBL_ENTRIES;
    unsigned int tblIdx = p % TBL_ENTRIES;

    printf("virtual = 0x%02X (p=%u, d=%u)\\n", vaddr, p, d);
    printf("dirIdx=%u, tblIdx=%u\\n", dirIdx, tblIdx);

    if (dir[dirIdx] == -1) { printf("Fallo: directorio no presente\\n"); return 1; }
    int marco = tbl[dirIdx][tblIdx];
    if (marco == -1) { printf("Fallo: página no presente\\n"); return 1; }
    unsigned int fis = marco * PS + d;
    printf("marco=%d, fisica=0x%02X\\n", marco, fis);
    return 0;
}
terminal · traducción con dos niveles
$ gcc -std=c17 -Wall -Wextra -o pag2niveles pag2niveles.c
$ ./pag2niveles
virtual = 0x2B (p=2, d=11)
dirIdx=0, tblIdx=2
marco=3, fisica=0x3Bmarco=3, fisica=0x3B

3. Tablas de dos niveles

En el ejemplo, la memoria virtual se divide en 16 páginas (4 directorios × 4 tablas). El directorio tiene 4 entradas, cada una apuntando a una tabla de 4 páginas. Solo se crean las tablas que se necesitan.

NivelTamañoEntradasQué contiene
Directorio4 entradas4Punteros a tablas de segundo nivel
Tabla de páginas4 entradas4Números de marco

4. El recorrido paso a paso

Para traducir una dirección virtual con dos niveles:

  1. Dividir la dirección: p = v / PS, d = v % PS.
  2. Dividir p: dirIdx = p / TBL_ENTRIES, tblIdx = p % TBL_ENTRIES.
  3. Consultar directorio: si dir[dirIdx] == -1, fallo de página (tabla no presente).
  4. Consultar tabla: marco = tbl[dirIdx][tblIdx]. Si es -1, fallo de página.
  5. Calcular física: física = marco × PS + d.

5. El simulador interactivo

Memoria con directorio de 4 entradas y tablas de 4 entradas. Avanza paso a paso y observa el recorrido.

Simulador · paginación con dos niveles

DIRECTORIO (4 entradas)

TABLA DE PÁGINAS (4 entradas)

RESULTADO

Página (p)
Desplazamiento (d)
Índice directorio
Índice tabla
Marco
Dirección física

6. Qué observar

7. Limitaciones del simulador

Este simulador es una simplificación. No modela:

8. En Linux

Linux usa 4 niveles de tabla (o 5 con 5-level paging). Las herramientas para inspeccionar:

terminal · paginación en Linux
$ getconf PAGESIZE
4096
$ cat /proc/cpuinfo | grep -i 'address sizes'
address sizes   : 46 bits physical, 48 bits virtual

9. Resumen

10. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Cuántos niveles tiene el simulador?

Dos: directorio y tabla de páginas.

2. ¿Qué ocurre si el directorio no tiene la entrada?

Se produce un fallo de página y no se consulta la tabla.

3. ¿Qué ocurre si la tabla no tiene la entrada?

Se produce un fallo de página y no se obtiene el marco.

4. ¿Cómo se calcula el índice del directorio?

Dividiendo el número de página por el número de entradas por tabla.

5. ¿Cómo se calcula el índice de la tabla?

Calculando el resto de la división del número de página por el número de entradas por tabla.

6. ¿Qué se conserva en la traducción?

El desplazamiento (d): es el mismo en la página virtual y en el marco físico.

7. ¿Cuántos niveles tiene x86-64 real?

Cuatro (o cinco con 5-level paging).

8. ¿Qué mitiga el costo de los múltiples accesos?

La TLB (caché de traducciones).

Para practicar

  1. Configura el directorio con la entrada 0 a -1 y traduce una dirección de la página 0-3. ¿Qué falla?
  2. Configura la tabla con la entrada 2 a -1 y traduce la dirección de la página 2. ¿Qué falla?
  3. Traduce la dirección 11 (p=0, d=11) y 27 (p=1, d=11). ¿Cuál es la física?
  4. Modifica el simulador para soportar 4 niveles (como x86-64).
  5. Explica por qué el simulador no modela la TLB.
  6. Investiga cómo Linux gestiona las tablas de páginas de un proceso.
  7. Dibuja el recorrido de la dirección 43 paso a paso.