frostbyte

Un kernel de sistema operativo casero para x86_64, en C y ensamblador. Arranca mediante Multiboot2, pasa a modo de 64 bits con sus propias tablas de páginas, tiene un planificador apropiativo y ejecuta programas en ring 3 - arranca de verdad en QEMU.

frostbyte
TL;DR

Un kernel de sistema operativo escrito desde cero - desde el cargador de arranque hasta ejecutar programas propios en modo usuario. Arranca de verdad, en QEMU.

Descripción general

frostbyte es un kernel x86_64 amateur, escrito en C y ensamblador. El objetivo no era escribir un "sistema operativo" en el sentido cotidiano, sino recorrer todo el camino que suele estar oculto: desde el momento en que el firmware cede el control hasta la ejecución de un programa propio en modo usuario, aislado del kernel.

Es uno de los tipos de proyecto más implacables que uno puede plantearse. Aquí no hay bibliotecas que resuelvan nada por ti, ni una capa que atrape un error. Hay una CPU desnuda, el manual de la arquitectura y tú. Precisamente por eso es una escuela tan buena.

En un programa corriente un error es local: salta una excepción, obtienes una traza de pila, corriges una línea. En un kernel no existe ninguna de esas comodidades. Un bit equivocado en una tabla de páginas y la máquina simplemente se reinicia - sin mensaje, sin registro, sin nada. La depuración se convierte en leer registros y adivinar cuál de tus últimos tres movimientos fue el fatal.

Esa dureza obliga a otra forma de trabajar. Cada paso hay que cerrarlo por separado y comprobarlo de forma aislada antes de añadir el siguiente, porque de lo contrario no se puede distinguir cuál de diez cambios tumbó toda la máquina. La disciplina aquí no es una virtud, sino la condición para avanzar siquiera.

Del firmware al ring 3

Todo el camino es una secuencia de transiciones entre niveles de control cada vez más altos. El firmware carga el kernel mediante Multiboot2 y entrega un mapa de memoria. Luego hay que activar el modo de 64 bits, lo que exige antes una paginación inicial. Después el kernel asume la memoria virtual sobre sus propias tablas de páginas, arranca un planificador que conmuta tareas por interrupción del reloj, y solo al final salta al ring 3.

1
Arranque mediante Multiboot2

el cargador de arranque carga el kernel y entrega un mapa de memoria.

2
Paso al modo de 64 bits

activar el long mode exige antes una paginación inicial.

3
Tablas de páginas propias

el kernel asume la gestión de la memoria virtual.

4
Un planificador preventivo

una interrupción del reloj conmuta tareas, sin su consentimiento.

5
Ring 3

un salto al modo usuario y la ejecución del primer programa propio.

El camino del encendido al programa propio

EtapaQué ocurreModo
Multiboot2el firmware cede el control, existe un mapa de memoriaring 0
Long modeentrada en el modo de 64 bitsring 0
Tablas de páginasel kernel asume la memoria virtualring 0
Planificadorel reloj conmuta tareas sin consentimientoring 0
Ring 3el primer programa, aislado del kernelring 3

Depurar cuando la máquina simplemente desaparece

Como un error no deja rastro, necesitábamos una forma de que el kernel pudiera decir algo antes de tener un controlador de pantalla. La respuesta es QEMU con salida por el puerto serie: el kernel escribe los registros como texto en el serie, y eso va directo a la terminal. Así ves la última línea antes del reinicio en lugar de una pantalla negra.

run.sh · bash
qemu-system-x86_64 \
  -cdrom frostbyte.iso \
  -m 512M \
  -serial stdio \
  -no-reboot -no-shutdown
!
Atención

En modo kernel no hay "casi funciona". Un error en un mapeo de memoria no tumba una función - tumba toda la máquina. Por eso cada paso se probó por separado en el emulador antes de añadir el siguiente, y los indicadores no-reboot y no-shutdown mantienen la máquina congelada ante un fallo en lugar de dejarla desaparecer en un bucle de reinicios.

El resultado: un sistema que de verdad arranca

Lo que sale es un kernel que arranca realmente en QEMU y llega a ejecutar un programa propio en ring 3 - no se detiene en imprimir "hello", sino que recorre todo el camino hasta el modo usuario. Es un proyecto construido para entender el ordenador hasta el fondo, llevado al punto en que esa comprensión queda demostrada por la ejecución, no declarada.

Más proyectos

Más trabajos de la misma categoría - mira cómo abordamos retos parecidos.

¿Tiene un proyecto similar?

Escríbenos - el presupuesto es gratuito y llega en una hora.