It's a joke between boot in English and 'bota' in Spanish (which is a type of shoe)... Soy español, sí, qué pasa
src
--- kernel source fileboot
--- bootloadercpu
--- interruptions and driverskernel
--- kernellibc
--- C librariesMakefile
--- Makefile
video
--- POCos-dev.pdf
--- MUST-READREADME
--- this filerun
--- use it, really
POC.mp4
8b928
El kernel implementa los siguientes comandos:
- HELP -> muestra un mensaje con la funcionalidad de cada comando
- POWER OFF -> apaga el sistema (en el caso de QEMU apaga la ventana)
- STACK -> muestra el stack en formato hexadecimal
- REBOOT -> reinicia la sesión (en el caso de QEMU hace un parpadeo y reinicia)
- HALT -> exit abrupto del sistema
- MEM -> reserva una página de memoria
En caso de meter algo que no esté permitido, devolverá el input del usuario por pantalla. Hay un run que automatiza todo, desde compilar hasta ejecutar. Si no quieres que elimine los archivos después de ejecutar, borra la línea 12 del archivo o dale a la opción 2.
Primero, empezamos definiendo una serie de funciones para imprimir por pantalla en modo real:
print_rm
es cout en la consola usando ttyprint_rm_carry
es para el '\n'print_rm_hex
para mostrar en formato decimal (errores, stack...)
que serán usadas por la función de lectura de disco para mostrar errores al cargar el kernel de disco. A futuro, se usará en un sistema de archivos o para optimizar el uso de la RAM con escrituras a disco (TL;DR no está implementado).
Seguimos con el cambio a modo protegido llamando a la función switch, que desactiva las interrupciones, carga el descriptor GDT, cambia el registro cr0
a modo protegido y llama a init_pm, que inicializa el resto de registros, el stack y le da paso al módulo que inicializa el kernel_entry. Este a su vez llama al main
del módulo del kernel.
En el kernel, se inicializan las rutinas de servicio de interrupción (ISR) y las rutinas de petición de interrupción (IRQ), registrando los callbacks
isr_handler
para lasISRs
irq_handler
para losIRQs
Por ahora, sólo tenemos dos IRQs
, el reloj y el teclado. Para el teclado, hay que definir primero una serie de puertos con los que se comunica, de manera que podamos recibir las interrupciones provenientes de los dispositivos.
Para poder mostrar texto y una terminal básica, necesitamos trabajar con la VGA. Se implementan una serie de funciones que imprimen en el array de la VGA los distintos caracteres que queramos, como al escribir en el teclado, así como para los mensajes que se envían desde el propio kernel.
Por último, el kernel implementa una serie de funciones que simulan los comandos usuales que se podrían esperar en una terminal de comandos.
Usamos una librería para definir las funciones auxiliares como memcpy
o strcmp
de C.