|TPE-Especial | 2Q2022 | Actualizado | 1Q2023 | | Integrante | Legajo | | Mercedes Baron | 61187 |
- Descripción general
- Compilación y ejecución del kernel
- Comandos disponibles
- Teclas para ejecutar ciertas acciones
- System Calls implementadas
Se ha desarrollado un pequeño sistema operativo a partir de Pure64, en el marco de la materia Arquitectura de Computadoras.
Es posible interactuar con el sistema a través de una terminal, que permite ejecutar diversos comandos para verificar su funcionamiento.
Para su utilización es necesario tener acceso a un teclado; el mouse no es utilizado.
⚠️ Kernel supone que se posee de un teclado con distrubución ANSI "United States".
Se necesitan tener instalados los siguientes paquetes para compilar y correr este proyecto:
- nasm
- qemu
- gcc
- make
- docker
Por única vez, descargar la imagen de Docker:
$ docker pull agodio/itba-so:1.0
Luego, cada vez que se quiera compilar, ejecutar el siguiente comando en el directorio del proyecto:
$ docker run -v ${PWD}:/root --security-opt seccomp:unconfined -ti agodio/itba-so:1.0
Se iniciará el contenedor de Docker. Ahora, ejecutar los siguientes comandos:
$ cd root
$ cd Toolchain
$ make all
$ cd ..
$ make all
$ exit
Ahora habremos cerrado el contenedor de Docker. Solo falta ejecutar el kernel:
$ ./run.sh
Primero, por única vez descargar la imagen de Docker:
$ docker pull agodio/itba-so:1.0
Luego, ejecutar el siguiente comandos en el directorio del proyecto:
$ docker run -d -v ${PWD}:/root --security-opt seccomp:unconfined -ti --name tpe agodio/itba-so:1.0
Luego, cada vez que se quiera compilar el proyecto, ejecutar los siguientes comandos en el directorio del proyecto:
$ ./a-compiletpe
$ ./run.sh
Programa que despliega en pantalla una lista de comandos válidos para introducir, junto a una pequeña descripción del mismo.
Programa que realiza una división por cero. El procesador lanzará una excepción de tipo 0. El objetivo del programa es verificar el funcionamiento de dicha excepción.
Programa que intenta ejecutar una instrucción inexistente/invalida. El procesador lanzará una excepción. El objetivo del programa es verificar el funcionamiento de dicha excepción.
Programa que imprime a pantalla una lista de los registros de uso general junto al valor que almacenaban en el momento que se tomó el snapshot (para tomar snapshot utilizar '-')
Luego de ingresar printmem se le pedira al usuario una posicion de memoria que debe cumplir ciertos requisitos para ser una dirección válida:
- Debe ser un valor hexadecimal válido
- Debe ser menor a (0x20000000 - 32). Esto se debe a que ese es el límite del mapa de memoria de QEMU.
Programa que imprime en pantalla la fecha y hora actual. Dicha fecha y hora es desplegada en GMT-3.
Al ejecutar play se comenzara jugar al juego 'Tron Light Cycles'. Hay dos jugadores el rojo y el azul, el jugador rojo se movera con las teclas 'wasd', mientras que el jugador aul se movera con 'ijkl'.
Cambia la fuente a una fuente con caracteres pequeños.
Cambia la fuente a una fuente con caracteres de tamaño mediano.
Cambia la fuente a una fuente con caracteres grandes.
Recordar que se supone que se posee de un teclado con distrubución ANSI "United States".
Acción | Tecla asociada |
---|---|
Saca una snapshot de los registros | - |
Se debe generar una interrupción del tipo 80 para ejecutar la system call deseada.
Los registros que se detallan a continuación deben poseer los parámetros para la ejecución de la system call.
En R8 se indica qué system call se desea ejecutar.
El valor de retorno de la system call se obtendrá en RAX.
System Call | R8 | RDI | RSI | RDX |
---|---|---|---|---|
Read | 0x00 | int fd | char * buf | int count |
Write | 0x01 | int fd | char * buf | int count |
Get Time | 0x02 | char * buf | ||
Has Ticked | 0x03 | |||
Clear Window | 0x04 | |||
Restart Cursor | 0x05 | |||
Initialize Window | 0x06 | |||
System Date | 0x07 | char * buf | ||
Register Info | 0x08 | |||
Paint System | 0x09 | color_t color | uint32_t position | |
Seconds Elapsed | 0x0A | |||
Miliseconds Elapsed | 0x0B | |||
Set Character Font | 0x0C | uint64_t fontNumber | ||
Get Character Font | 0x0D |
Recibe un file descriptor de donde leer, un vector de caracteres donde se guardarán los caracteres leídos y la cantidad de bytes a leer.
Retorna la cantidad de bytes leídos.
🗣 El primer argumento (File Descriptor) se incluye para seguir el estándar de Linux. Sin embargo, en este kernel sólo se puede leer de la entrada estándar y eso es lo que ocurrirá sin importar el valor del parámetro
Recibe un file descriptor a donde escribir, un vector de caracteres con los caracteres a escribir y la cantidad de bytes a escribir.
Retorna la cantidad de bytes que se escribieron.
Los file descriptor disponibles son:
0 | Standart Input |
1 | Standard Output |
2 | Standard Error |
Retorna la hora actual (hora, minutos, segundos) en el buffer enviado como parametro.
No recibe parametros.
Limpia la pantalla imprimiendo pixeles negros en toda la extension de la misma.
No recibe parametros.
Resetea la posicion del 'cursor' al principio de la pantalla. El cursor es la proxima posicion donde se imprimen caracteres, este se mueve a medida que se imprimen caracteres.
No recibe argumentos.
Inicializa la pantalla.
Retorna la fecha actual (dia, mes, año) en el buffer enviado como parametro.
Retorna la informacion de los registros tomada en la ultima 'snapshot'.
Recibe un color y una posicion de la pantalla.
Pinta la posicion de pantalla recibida del color que recibe.
No recibe argumentos.
Retorna la cantidad de segundos desde que se inicio el kernel.
No recibe argumentos.
Retorna la cantidad de milisegundos desde que se inicio el kernel.
Recibe un uint32_t de argumento que es el id de la fuente.
Modifica la fuente actual a la fontNumber recibida.
Devuelve la fuente actual.