Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-0122 Sistemas Operativos
Proyectos
|
|
CI0122
/
Proyectos
/ Proyecto-02 |
Read.Me Proyecto 2
Modalidad: individual
[Ejercicio propuesto: 2023/May/03; entrega 2023/May/31]
Objetivos
Entender el procedimiento para cargar un programa de usuario de NachOS a la memoria
Cambiar el sistema de memoria de NachOS para permitir que varios procesos o hilos puedan correr
Construir elementos para realizar la administración de memoria
Entender la estructura interna de los programas de usuario, en especial el encabezado:
Header, Text, InitData
Entender como los programas de usuario son leidos del disco
Entender las estructuras de datos necesarias para la administración de procesos
Representación interna de un hilo, clase Thread
Representación interna de la memoria de un hilo de usuario, clase AddrSpace
Mapeo de memoria lógica a memoria física, PageTable
Completar algunos llamados al sistema relacionados con la ejecución de hilos o procesos
Fork, Yield, Exec, Join, Exit
Entender la administración de recursos por medio de una tabla (tabla de recursos abiertos)
Completar los elementos de sincronización de hilos
Completar la funcionalidad de los sockets
Introducción
Queremos correr varios programas de usuario en NachOS, ya que la configuración original solo permite uno
Para entender como los programas de usuario son cargados en memoria vamos a revisar "addrspace", el constructor
es quien recibe el archivo ejecutable abierto, comprueba que sea ejecutable y lo carga en la memoria principal
Un programa de usuario se ejecuta cuando se inicia NachOS con la opción "-x ../test/halt", en este caso
se corre el programa de usuario "halt" por el método "StartProcess" en el archivo "progtest.cc" del directorio
"userprog"; este programa debe ser leido del disco, colocado en la memoria de MIPS y crear el hilo de kernel
correspondiente para ejecutarlo
Funcionamiento
En esta entrega, vamos a modificar la clases "AddrSpace" en los archivos "addrspace.h" y "addrspace.cc"
para darle soporte a la "paginación" en donde los elementos de memoria son manipulados como páginas.
Vamos a dividir la memoria de NachOS en 32 páginas de 128 bytes cada una (ambas constantes) y colocar las
estructuras de datos necesarias para realizar la administración de memoria.
También vamos a construir los llamados al sistema para la ejecución de hilos y procesos
Tareas
- Revisar la declaración de la memoria de la máquina MIPS emulado por NachOS (machine/machine.h)
- Investigar como NachoOS carga los programas a memoria originalmente, para ello hay que revisar los archivos
"addrspace.h" y "addrspace.cc" en el directorio "userprog". El constructor es el encargado de tomar el
programa de usuario y cargarlo en la memoria
- Comprender como se determina el tamaño del programa de usuario y la cantidad de páginas a utilizar
- ¿Cuántas páginas se le da a la pila del proceso?
- Entender qué es una tabla de páginas y su uso dentro de NachOS. Comprender el mapeo que se hace originalmente
entre las páginas lógicas y las físicas. Revisar el funcionamiento de los bits de protección de la tabla de páginas
- Crear las estructuras necesarias para manipular la memoria de MIPS con paginación:
Debe tener una estructura para determinar cuáles páginas de la memoria están libre/ocupadas (BitMap)
- Definir una nueva manera de entregar las páginas al programa de usuario utilizando paginación, diferente de la
manera secuencial
- Comprobar que el programa de usuario puede ser cargado en distintas páginas de memoria, colocando algunas de las
páginas de memoria como ocupadas antes de la ejecución
- Construir un programa de usuario que demuestre que sus cambios son funcionales, en el directorio "test"
- Completar los siguientes llamados al sistema:
Fork, Yield, Exec, Join, Exit
Para este proyecto debe completar:
La carga de procesos en páginas a partir del archivo ejecutable (addrspace.h y addrspace.cc)
La administración de memoria para que el programa de usuario solo ocupe las páginas necesarias
Buscar una página de memoria libre
Asignar esa página al programa del usuario y marcarla como ocupada
Agregar esta información a la tabla de páginas del proceso
Un programa de usuario de comprobación de los cambios, por ejemplo "shell.c", "fork2.c"