Objetivos
- General
- Hacer el diseño de la memoria virtual de NachOS
- Específicos
- Entender el concepto de "page fault" (falta de página)
- Comprender los elementos involucrados cuando ocurre una excepción tipo "Page Fault" y la manera de resolverla
- Características de la página faltante
- Actualización de estructuras
Requisitos
- Tener una instalación de NACHOS, se puede emplear el primer proyecto, "userprog"
- Tener instalado un editor de textos
- Papel y lápiz
Notas
- La parte de memoria virtual se encuentra en el directorio "vm" del proyecto NachOS
- Para realizar la compilación de esta parte se define estos símbolos en el archivo "Makefile" utilizando la directiva "-D VM"
- VM
- USE_TLB
- Esto cambia un poco la manera en que NachOS realiza los accesos memoria, revisar el método "Machine::Translate" en el archivo "translate.cc" del directorio "machine"
- El área de SWAP se representará empleando un archivo normal dentro del sistema de archivos de Linux, NachOS se encargará de manipular este archivo adecuadamente (abrir, cerrar, escribir, leer o destruir)
Procedimiento
- Entender el concepto de "PageFault" y comprender los elementos involucrados
- Estudiar el método "Translate" e identificar y anotar en su diseño cómo y cuándo es que se produce el "PageFault exception", para ello debe
- Revisar el código en el archivo "machine/translate.cc"
- Para realizar las lecturas o escrituras a la memoria del procesador MIPS, el simulador utiliza los métodos "Machine::ReadMem" y "Machine::WriteMem", note que estos métodos utilizan direcciones virtuales o lógicas, anote ¿Por qué?; explicar los casos en que estos métodos retornan falso
- Explicar como se traducen las direcciones virtuales a físicas en los métodos anteriores
- Explicar el funcionamiento del método "Translate", describa los parámetros que recibe este método, su tipo y una explicación propia de para qué se utilizan, además anote el tipo de retorno del método, las posibles excepciones que puede retornar y por qué se generan
- Describir la manera cómo se emplea el TLB (Translation Look-Aside Buffer) en el procesador MIPS
- Describir en su diseño los elementos de la estructura "pageTable" en la clase "AddrSpace"
- Explicar lo que hacen los métodos "RestoreState" y "SaveState" de la clase "AddrSpace"
- Anotar la descripción de la declaración de "tlb" en "machine.h"
- Explicar la inicialización de la variable "tlb" en "machine.cc"
- Anotar los elementos de la estructura "tlb", explique porqué son iguales a los elementos de "pageTable" de "AddrSpace"
- Explicar para qué sirven las variables "pageTable" y "tlb" en la clase "Machine"
- Indicar cómo se realiza la búsqueda de la dirección virtual y anote cómo se calcula la página que la contiene, la variable "vpn"
- Anote el procedimiento cuando el simulador utiliza la variable "pageTable" para realizar la búsqueda
- Anote el procedimiento cuando se utiliza la variable "tlb"
- Si la página es válida, en ambos casos se define una variable "entry", anote qué representa y cuál es su contenido lógico
- Indicar cómo se asocia la página virtual al marco de memoria física correspondiente
- Explicar que representa la variable "pageFrame" en el método "Translate"
- Explicar cómo se obtiene la dirección física y cómo la devuelve este método "Translate"
- Explicar que hace esta porción de código del método "Translate", indique en cuál estructura de datos ocurren estos cambios
...
entry->use = true; // set the use, dirty bits
if (writing)
entry->dirty = true;
...
- Explicar la funcionalidad de la bandera (bit) "dirty"
- Identificar los casos en que se produce el "PageFaultException" en el método "Translate"
- El simulador de MIPS no avanza los contadores de programa cuando ocurren las excepciones, en el caso de "SysCallException" lo tuvimos que hacer 'manualmente', en el caso de "PageFaultException" no hay que hacerlo, pues es indispensable que la instrucción que causó la excepción sea reejecutada
- Explicar cómo va a resolver cada uno de los casos encontrados en que ocurre una excepción "PageFault"
- Explicar cómo va a obtener las páginas de la memoria principal para asignarlas a las páginas faltantes
- Explicar cómo va a resolver el problema si toda la memoria física está llena
- Explicar en que casos la página que se reemplaza debe ir a SWAP y en que caso no
- Analizar todos los casos posibles para la página que necesita ser reemplazada y su diseño de solución
- Utilización del archivo de intercambio (SWAP)
- Explicar la estructura interna del archivo de intercambio SWAP
- Indicar el momento en que el archivo debe construirse y destruirse
- Indicar la cantidad de elementos que este archivo debe contener
- Explicar su estrategia para que NachOS conozca cuáles de esos elementos están ocupados y cuáles están libres
- Características de la página faltante
- Determinar cuál es la página de la dirección lógica que generó la CPU, es decir, la que provocó la excepción (PageFault exception)
- Explicar por qué se generó esta excepción
- Determinar cuál es la dirección que causó la excepción. Para ello debe revisar "machine.h" y la definición de los registros de la CPU, en particular ver el registro 39
- Explicar la manera en que se calcula la porción de la dirección lógica correspondiente a la página y la porción para el desplazamiento
- Indicar el procedimiento a seguir para lograr que no vuelva a ocurrir esa excepción de falta de página
- Propiedades de la página faltante
- Describir el procedimiento a seguir si la página hay que leerla del archivo original (ejecutable). Piense en la posibilidad de que el archivo deba ser abierto nuevamente y que para ello es necesario que su NachOS conozca el nombre del archivo, esta sería una nueva característica de la clase "AddrSpace"
- Analizar el caso en el que la página se encuentra sucia, anotar el procedimiento para recuperarla
- De acuerdo con las características de la página faltante descritas, construir una tabla de casos e indicar la estrategia para recuperar la página faltante en cada caso
- Si se trata de una página de Pila, S , Datos inicializados, Di , Datos No inicializados , Dni o de Código, T
- Si está sucia o no, explicar cuáles páginas no se pueden ensuciar y por qué
- Si la página va de salida (víctima) o de entrada (solicitada)
- De donde la página es tomada o donde es colocada
- Actualización de estructuras
- Explique qué método cambia las banderas (bits) "dirty" y "use" y en cuál estructura de datos ocurre ese cambio
- Anotar los casos en que se debe cambiar el bit de validez de una página (de falso a verdadero y viceversa), indique cuales estructuras de datos deben reflejar ese cambio
- Indicar cuáles estructuras debe actualizar para evitar que esa excepción ("PageFaultException") siga ocurriendo
- En los métodos "RestoreState" y "SaveState" indicar los cambios que considera necesarios para mantener el funcionamiento correcto de la memoria virtual de NachOS
- En NachOS cuando ocurre un cambio de contexto, el hilo que sale llama al método "SaveState" y el hilo que entra llama a "RestoreState"
- Recuerde que al igual que con "pageTable" de la clase "Machine", solo vamos a tener un "tlb" que utilizan todos los hilos, el hardware modifica el TLB, pero esos cambios deben persistir en las "pageTables" de cada hilo
- Explicar qué debe hacer NachOS cuando tiene que sacar un hilo de la máquina para cederlo a otro, explicar qué cambios pueden ocurrir en los datos de la TLB y en qué lugar se debe almacenar esos cambios
- Explicar los cambios necesarios a aplicar en los métodos anteriores para permitir ese cambio de contexto, indique cual sería el estado correcto de la TLB de la máquina cuando un proceso recién comienza a correr
- Anote en su informe todos los cambios aplicados y las pruebas realizadas
- Fin