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.
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.
il bootloader carica il kernel e passa una mappa di memoria.
abilitare la long mode richiede prima un paging iniziale.
il kernel prende in carico la gestione della memoria virtuale.
un interrupt del timer commuta i task, senza il loro consenso.
un salto in modalità utente e l'esecuzione del primo programma proprio.
La strada dall'accensione al programma proprio
| Fase | Cosa accade | Modalità |
|---|---|---|
| Multiboot2 | il firmware cede il controllo, esiste una mappa di memoria | ring 0 |
| Long mode | ingresso nella modalità a 64 bit | ring 0 |
| Tabelle delle pagine | il kernel prende in carico la memoria virtuale | ring 0 |
| Scheduler | il timer commuta i task senza consenso | ring 0 |
| Ring 3 | il primo programma, tagliato fuori dal kernel | ring 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.
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.



