frostbyte

Un kernel di sistema operativo hobbistico per x86_64, in C e assembly. Fa il boot tramite Multiboot2, passa alla modalità a 64 bit con le proprie tabelle delle pagine, ha uno scheduler preemptive ed esegue programmi in ring 3 - si avvia davvero in QEMU.

frostbyte
TL;DR

Un kernel di sistema operativo scritto da zero - dal bootloader fino all'esecuzione di programmi propri in modalità utente. Si avvia davvero, in QEMU.

Panoramica

frostbyte è un kernel x86_64 amatoriale, scritto in C e assembly. L'obiettivo non era scrivere un "sistema operativo" nel senso comune, ma percorrere tutta la strada di solito nascosta: dal momento in cui il firmware cede il controllo fino all'esecuzione di un proprio programma in modalità utente, isolato dal kernel.

È uno dei tipi di progetto più spietati che ci si possa porre. Qui non ci sono librerie che sbrigano qualcosa al posto tuo, né uno strato che intercetti un errore. C'è una CPU nuda, il manuale dell'architettura e tu. Proprio per questo è una così buona scuola.

In un programma ordinario un errore è locale: scatta un'eccezione, ottieni uno stack trace, correggi una riga. In un kernel nessuno di questi comfort esiste. Un bit sbagliato in una tabella delle pagine e la macchina semplicemente si riavvia - senza messaggio, senza log, senza nulla. Il debug diventa lettura di registri e indovinare quale delle tue ultime tre mosse sia stata quella fatale.

Questa durezza impone un altro modo di lavorare. Ogni passo va chiuso a sé e verificato in isolamento prima di aggiungere il successivo, altrimenti non si riesce a distinguere quale di dieci modifiche abbia fatto crollare l'intera macchina. Qui la disciplina non è una virtù, ma la condizione per andare avanti del tutto.

Dal firmware al ring 3

Tutta la strada è una sequenza di transizioni tra livelli di controllo sempre più alti. Il firmware carica il kernel tramite Multiboot2 e passa una mappa di memoria. Poi va abilitata la modalità a 64 bit, che richiede prima un paging iniziale. Quindi il kernel prende in carico la memoria virtuale sulle proprie tabelle delle pagine, avvia uno scheduler che commuta i task tramite interrupt del timer, e solo alla fine salta al ring 3.

1
Avvio tramite Multiboot2

il bootloader carica il kernel e passa una mappa di memoria.

2
Passaggio alla modalità a 64 bit

abilitare la long mode richiede prima un paging iniziale.

3
Tabelle delle pagine proprie

il kernel prende in carico la gestione della memoria virtuale.

4
Uno scheduler preemptivo

un interrupt del timer commuta i task, senza il loro consenso.

5
Ring 3

un salto in modalità utente e l'esecuzione del primo programma proprio.

La strada dall'accensione al programma proprio

FaseCosa accadeModalità
Multiboot2il firmware cede il controllo, esiste una mappa di memoriaring 0
Long modeingresso nella modalità a 64 bitring 0
Tabelle delle pagineil kernel prende in carico la memoria virtualering 0
Scheduleril timer commuta i task senza consensoring 0
Ring 3il primo programma, tagliato fuori dal kernelring 3

Debug quando la macchina semplicemente sparisce

Poiché un errore non lascia traccia, ci serviva un modo perché il kernel potesse dire qualcosa prima di avere un driver dello schermo. La risposta è QEMU con output sulla porta seriale: il kernel scrive i log come testo sulla seriale, e questo va dritto al terminale. Così vedi l'ultima riga prima del reset invece di uno schermo nero.

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

In modalità kernel non esiste il "quasi funziona". Un errore in una mappatura di memoria non fa crollare una funzione - fa crollare l'intera macchina. Per questo ogni passo è stato testato a sé nell'emulatore prima di aggiungere il successivo, e i flag no-reboot e no-shutdown tengono la macchina congelata su un guasto invece di farla sparire in un ciclo di riavvii.

Il risultato: un sistema che davvero si avvia

Ne esce un kernel che si avvia davvero in QEMU e arriva a eseguire un proprio programma in ring 3 - non si ferma alla stampa di "hello", ma percorre tutta la strada fino alla modalità utente. È un progetto costruito per capire il computer fino in fondo, portato al punto in cui questa comprensione è provata dall'esecuzione, non dichiarata.

Altri progetti

Altri lavori della stessa categoria - scopri come affrontiamo sfide simili.

Hai un progetto simile?

Contattaci - il preventivo è gratuito e arriva entro un'ora.