Está en la página 1de 3

Tema 3: Traducción de direcciones.

1. Claves para la virtualización de memoria:


Para la virtualización de la CPU usamos la ejecución directa delimitada o LDE. Donde el
hardware ejecuta el programa, pero en ciertos momentos el sistema operativo hace arreglos.
Se busca:
➢ Eficiencia (con el apoyo del hardware).
➢ Control (con el apoyo del hardware): cada aplicación accede solo a su región de
memoria sin afectar a otras ni al sistema operativo.
➢ Flexibilidad: los espacios de direcciones de los programas se deben adaptar,
facilitando la programación del sistema.

2. Traducción de direcciones
Para ello usaremos la traducción de direcciones basada en hardware, que transforma cada
dirección de memoria virtual en la correspondiente física donde realmente están los datos.
La gestión de memoria la realiza el sistema operativo y la traducción la hace le hardware.
¿Cómo conseguimos esto?
1. Asumiremos un espacio de direcciones localizado en posiciones contiguas de la
memoria física.
2. Asumiremos un espacio de direcciones es siempre menor que el de la memoria
física.
3. Asumiremos que el tamaño del espacio de direcciones es siempre el mismo.
4. Dynamic relocation(1950) es una estrategia de traducción basado en 2 registros de
CPU: base y bounds(límites), que permite localizar el programa en cualquier lugar
de la memoria física y ejecutarlo asegurándose de que solo accede a su espacio de
direcciones.
➢ Base: dirección física donde se carga el programa. Traducción:
physical adress = virtual adress + base
➢ Bounds: permite comprobar que la dirección está dentro de los límites. Si la
dirección virtual es mayor o menor que los limites la CPU generará una
excepción y el proceso finalizará.
Es dinámico porque la traducción se hace en tiempo de ejecución. La parte del procesador
que ayuda a la traducción se la conoce como memory management unit, MMU.
Ejemplo: Suponiendo el espacio de direcciones de la imagen y cuyo código en c es:
void func(){
int x = 3000;
x = x + 3;
}
Y el compilador lo convierte al código que hay en la parte de
code del espacio de direcciones. Cuando se ejecuta la
instrucción, se producen los siguientes accesos a memoria:
➢ Obtener instrucción en la dirección 128
➢ Ejecutar la instrucción → Se carga X en 15 KB
➢ Obtener la instrucción en la dirección 132
➢ Ejecutamos la instrucción → X = X + 3
➢ Obtenemos la instrucción en la dirección 135
➢ Ejecutamos la instrucción → Cargamos X en 15 KB
En este caso el espacio crece hasta 16KB por lo que todas las
referencias a memoria deben de estar [0, 16KB]. Sin
embargo, en la virtualización de la memoria, el SO coloca el
proceso en otro lugar de la memoria física (imagen 2).
Se coloca en 32 KB que es el
valor que tomará base. Por
ejemplo cuando ejecutamos la
operación de 128 el PC se
localiza en dicha posición. Y
cuando se ejecuta suma al PC,
base, para obtener la dirección
física. Y así con las demás
operaciones. Bounds es el limite
en el que se puede obtener un
dato, si se sobrepasa hay
segmentation fault.

Ejemplo 2: Traduce las direcciones mediante base and bounds. Para un proceso con
espacio de direcciones de 4KB cargado en una dirección física de 16KB.
Base = 16 KB = 16 * 210 = 16384
Bounds = 16KB + 4 KB = 20KB = 20480
Por lo que al traducir 4400 en su dirección física
4400+16384 = 20784 > 20480 se sale de los
límites por lo tanto de fault.
3. Necesidades de hardware.
La CPU genera excepciones si un programa trata de cambiar los registros base/bounds y
proporciona una manera de informar de la localización base/bounds.
El sistema operativo se encarga de:
➢ Encontrar sitio para el espacio de direcciones de un programa nuevo. Se suele tener
una
estructura de datos(free list) detallando los espacios en uso/libres.
➢ Reclamar(limpiar) toda la memoria de un proceso cuando este termina y actualiza la
“free list”.
➢ Actualiza base/bounds cuando cambia el programa al que están asociados.
➢ Incorporar exception handlers

También podría gustarte