Objetivos
- Atrapar la excepción de "PageFault" en "ExceptionHandler"
- Modificar el constructor de la clase "AddrSpace" para invalidar todas las páginas lógicas
- Modificar el método "AddrSpace::RestoreState" para conseguir que el sistema empleé TLB únicamente
- Agregar la lógica necesaria para cargar las páginas de memoria que necesita un proceso
- Establecer el procedimiento para el manejo de la excepción de falta de página ("page fault exception")
- Hacer que el programa de usuario "halt" corra
Requisitos
- Tener instalado un compilador de C++
- Tener una instalación de NACHOS
Notas
- El proyecto de memoria virtual está en el directorio "vm" del proyecto NachOS
- Para realizar la compilación de esta parte se definen estos símbolos
Procedimiento
- Cambiar el constructor de "AddrSpace" que recibe un "OpenFile *": AddrSpace( Openfile * executable)
- Recuerde que los cambios los puede realizar utilizando compilación condicional, por ejemplo en el código del constructor se puede agregar algo parecido a esto:
#ifdef VM
pageTable[i].valid = false;
#else
pageTable[i].valid = true;
#endif
o
#ifndef VM
pageTable[i].valid = true;
#else
pageTable[i].valid = false;
#endif
- Haga que todas las páginas de "pageTable" sean inválidas, para ello debe modificar el campo "valid" de esta estructura
- Elimine toda la parte de carga del programa del archivo de disco, de manera que no se cargue ninguna página a memoria, se puede hacer con #ifdef
- Intente correr el programa de usuario "halt" y anote en el informe los resultados
- Identificar y anotar en su informe 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 en su informe ¿por qué?; explicar los casos en que estos métodos retornan falso
- Describir la manera cómo se emplea el TLB (Translation Look-Aside Buffer) en el procesador MIPS
- Revisar la descripción de la declaración de "tlb" en "machine.h"
- Revisar la iniciacilización de la variable "tlb" en "machine.cc"
- Explicar para qué sirven las variables "pageTable" y "tlb" en la clase "Machine"
- En el método "machine::Translate" ponga atención a los "ASSERT" que controlan que ambas variables ("tlb" y "pageTable") no pueden ser nulas, pero tampoco pueden ser ambas distintas de nulo; siempre tiene que haber una de ellas nula y la otra no nula
- Revise el método "AddreSpace::RestoreState" y note que siempre se le coloca un valor a la variable "pageTable" de "machine", esto debe cambiarse porque sino "tlb" y "pageTable" de "machine" serían ambas distintos de nulo y falla unos de los "ASSERT" de "translate"
#ifndef VM
machine->pageTable = pageTable;
machine->pageTableSize = numPages;
#endif
- Indicar cómo se realiza la búsqueda de la dirección virtual y anote en su informe 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 en su informe qué representa y cual es su contenido lógico
- Indicar cómo se asocia la página virtual al marco de memoria física
- Explique que representa la variable "pageFrame" en el método "Translate"
- Explique como se obtiene la dirección física y como la devuelve este método "Translate"
- Explique que hace esta porción de código del método "Translate", indique en cual estructura de datos ocurren estos cambios
...
entry->use = true; // set the use, dirty bits
if (writing)
entry->dirty = true;
...
- 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
- Explique como resolver cada uno de los casos encontrados
- Agregar el código necesario para 'atrapar' la nueva excepción de falta de página en "exception.cc", por ejemplo que haga que su programa de NachOS escriba un rótulo que indique la ocurrencia de la excepción, el programa se va a enclicar pues no hemos hecho nada para resolver la excepción
- 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)
- Explique en su informe por que se generó esta excepción
- Averiguar 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
- A partir de la dirección lógica, calcular el número de página lógico necesario
- Revisar la estructura de datos "pageTable" de la variable "space" del hilo que se está ejecutando en este momento y verificar el estado de la página faltante, puede emplear rótulos informativos
- Indicar el procedimiento a seguir para lograr que no vuelva a ocurrir esa excepción de falta de página
- Actualización de estructuras
- Anote en su informe 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
- Indique cuáles estructuras debe actualizar para evitar que esa excepción ("PageFaultException") siga ocurriendo
- Revise la tabla de páginas de cada hilo, indique cuáles cambios debe realizar cuando se resuelve una falta de página. Explique porqué es necesario que los hilos tengan tabla de páginas a pesar de que la máquina no la tiene definida. Cuál es su utilidad?
- En los métodos "RestoreState" y "SaveState" indique los cambios que considera necesarios para mantener el funcionamiento correcto de la memoria virtual de NachOS
- Recuerde que al igual que con "pageTable" de la clase "Machine", solo vamos a tener un "tlb" que utilizan todos los hilos, sin embargo, existe un "pageTable" por cada hilo que corre. En un cambio de contexto el proceso que sale llama al método "SaveState" y el que entra a "RestoreState"
- Explique qué debe hacer NachOS cuando tiene que sacar un proceso de la máquina para cederlo a otro, explique qué cambios pueden ocurrir en los datos de la TLB y en que lugar se debe almacenar esos cambios
- Explique los cambios necesarios a aplicar en los métodos anteriores para permitir un 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
- Actualización de información
- TLB
- Indique una manera en que se puede ir llenando el TLB
- De dónde se obtiene los datos que se colocan en el TLB
- Explique el algoritmo empleado para crear espacio en la TLB en caso de encontrarse llena. Para la entrega final este algoritmo ser distinto de FIFO. Describa los cambios a realizar en la tabla de páginas del proceso
- Pruebas (anote los resultados en su informe)
- Verifique que este programa "halt.lab" funcione, debe hacer 3 faltas:
- 0, en la página 0
- 208, en la página 1
- 1260, en la página 9
- Verifique que este otro programa "halt" funcione, debe hacer 3 faltas:
- 0, en la página 0
- 272, en la página 2
- 1388, en la página 10
- Fin