Escribiendo un kernel básico en C

Desde hace bastante tiempo, uno de los aspectos de la informática que más me ha fascinado ha sido la interacción del hardware con el software, es decir, los sistemas de bajo nivel. Ahí entran con mucha importancia los sistemas operativos.

Cuando cursé las asignaturas de ‘Introducción a Sistemas Operativos’ de primero y ‘Sistemas Operativos’ de segundo, despertaron aún más interés en mí sobre este tema, al punto de querer implementar mi propio kernel sencillo con aspectos básicos del mismo.

A esas alturas, aún no tenía el conocimiento ni el tiempo suficiente para lanzarme a llevar a cabo tan ambiciosa tarea. Hasta que hace año y medio aproximadamente, lo estuve sopesando como posible tema para mi Trabajo de Fin de Grado. Pasé meses pensando la idea, explorando repositorios de kernels sencillos subidos en GitHub, consultando a diferentes modelos de IA sobre la idea y preguntando sobre el tema a mi presente tutor del TFG.

A principios del pasado verano empecé a experimentar con el tema, pero me di cuenta que era una tarea sumamente complicada y que muy difícilmente se podría implementar en un TFG, por lo que opté en decantarme hacia otra opción, y decidí desarrollar este kernel como una especie de ‘experimento’.

Lógicamente no podía llevar a cabo tal proyecto sin ayuda, así que me apoyé (bastante además), en una herramienta llamada Zencoder, durante su periodo de prueba gratuito. En líneas generales, yo puntualicé la estructura que quería, los módulos que buscaba implementar y las líneas de desarrollo que quería seguir.

Qué tiene
  • Controladores básicos como VGA (para salida de pantalla), ATA (para medios de almacenamiento) y de teclado con interfaz PS/2. Todos ellos son drivers para dispositivos antiguos, ya que programar drivers para dispositivos modernos es extremadamente complicado.
  • Sistema de archivos sencillo basado en FAT12 de Microsoft, con la adición de directorios y subdirectorios.
  • Un programa básico de consola (shell) con comandos básicos como ls, cat, touch, rm, edit, mkdir, cd, pwd, history, reboot, y shutdown.
  • Gestión básica de interrupciones de la CPU.
  • Gestor de arranque (bootloader) con GNU GRUB.
Qué no tiene
  • Gestor de procesos, no existe el concepto de proceso ni de multitarea, se ejecuta un único flujo de control de principio a fin.
  • Gestor de memoria, no hay gestión dinámica de memoria, toda la memoria se usa de forma estática.
  • Soporte de paginación, la memoria virtual no está implementada, el kernel opera directamente sobre direcciones físicas.
  • Ejecución de programas externos, no hay forma de cargar y ejecutar binarios desde el sistema de archivos.
Ejemplo

Ejemplo de uso de dicho kernel

Repositorio

El repositorio con dicho proyecto es público y está alojado en:
https://github.com/mcastroes/osdev