Progettare un sistema operativo in camera bianca
La maggior parte dei sistemi operativi moderni è costruita su decenni di codice accumulato, librerie e dipendenze esterne. Sebbene questo ecosistema abiliti uno sviluppo rapido, introduce anche complessità, assunzioni nascoste e rischi di sicurezza potenzialmente non esaminati.
EriX adotta un approccio diverso.
Viene sviluppato come un sistema operativo in camera bianca, il che significa che ogni componente - dal bootloader ai servizi in spazio utente - è implementato all’interno del progetto stesso, senza incorporare codice sorgente esterno o librerie di terze parti.
Questo articolo esplora cosa significa in pratica lo sviluppo in camera bianca, perché è utile e quali compromessi introduce.
Che cosa significa “camera bianca”?⌗
Nel contesto di EriX, lo sviluppo in camera bianca significa:
- Nessun codice sorgente esterno viene copiato o riutilizzato
- Nessuna libreria o crate di terze parti viene inclusa
- Tutti i componenti sono implementati all’interno del progetto
- Possono essere consultate solo specifiche e documentazione pubbliche
Il risultato è un sistema in cui ogni riga di codice è:
- compresa
- auditabile
- progettata intenzionalmente
Questa non è solo una decisione legale o di licenza: è una decisione architetturale.
Perché evitare codice esterno?⌗
Evitare dipendenze esterne può sembrare restrittivo. Lo sviluppo software moderno incoraggia normalmente il riuso, e i grandi ecosistemi esistono proprio per evitare di reinventare la ruota.
Tuttavia, i sistemi operativi non sono applicazioni tipiche.
1. Complessità nascosta⌗
Il codice esterno porta spesso assunzioni implicite:
- sul layout della memoria
- sui modelli di concorrenza
- sulla gestione degli errori
- sul comportamento della piattaforma
Queste assunzioni potrebbero non allinearsi con l’architettura di un nuovo sistema operativo, specialmente uno costruito intorno a capacità e isolamento rigoroso.
2. Base di calcolo fidata (TCB) ampliata⌗
Ogni dipendenza aumenta la dimensione della base di calcolo fidata.
Se una libreria di terze parti viene usata nel kernel o in componenti critici del sistema, la sua correttezza diventa parte delle garanzie di sicurezza del sistema.
Lo sviluppo in camera bianca mantiene la TCB:
- piccola
- controllata
- definita esplicitamente
3. Auditabilità e verifica⌗
Un sistema costruito interamente internamente può essere auditato in modo sistematico.
- Tutto il codice unsafe può essere esaminato
- Tutti gli invarianti possono essere documentati
- Tutte le interfacce possono essere ragionate
Questo è particolarmente importante per un sistema come EriX, che enfatizza:
- autorità esplicita
- sicurezza basata su capacità
- progettazione minimale del kernel
4. Libertà architetturale⌗
Riutilizzare codice esistente spesso vincola le decisioni di progettazione.
Per esempio:
- adottare una libreria può imporre una particolare forma di API
- integrare codice esistente può richiedere livelli di compatibilità
- astrazioni legacy possono filtrare nei nuovi componenti
Lo sviluppo in camera bianca consente al sistema di essere plasmato interamente dai propri principi, invece che da vincoli ereditati.
Camera bianca vs. reimplementazione⌗
È importante distinguere lo sviluppo in camera bianca dalla semplice reimplementazione.
Lo sviluppo in camera bianca non significa riscrivere alla cieca sistemi esistenti.
Al contrario, implica:
- studiare specifiche pubbliche
- comprendere i principi sottostanti
- progettare nuove implementazioni a partire dai primi principi
Per esempio:
- Un file system può seguire la semantica POSIX, ma essere implementato in modo indipendente
- Un bootloader può seguire le specifiche UEFI, ma usare una struttura personalizzata
- Una libreria standard C può esporre la stessa API, ma essere scritta interamente in Rust
L’obiettivo è la compatibilità dove necessaria, senza riuso di codice.
Camera bianca in pratica⌗
In EriX, i vincoli di camera bianca sono applicati a tutto il sistema.
Nessun crate esterno⌗
Anche in Rust, dove il riuso delle dipendenze è comune, EriX evita crate esterni.
Definisce invece componenti riutilizzabili interni, come:
- utilità di memoria
- primitive di sincronizzazione
- astrazioni di capacità
Librerie interne⌗
Le funzionalità riutilizzabili sono organizzate in crate interni, per esempio:
lib-bootimglib-capabilib-ipc
Queste librerie sono:
- versionate
- controllate all’interno del progetto
- progettate specificamente per le necessità del sistema
Struttura rigorosa del repository⌗
Ogni sottosistema è isolato:
- bootloader
- kernel
- IPC
- gestione della memoria
- servizi in spazio utente
Questo impone modularità e impedisce accoppiamenti nascosti.
Build riproducibili⌗
La progettazione in camera bianca si estende anche al processo di build.
Il sistema punta a:
- build deterministiche
- assunzioni minime sulla toolchain
- passaggi di build espliciti
Questo assicura che gli artefatti possano essere riprodotti e verificati.
Benefici di un OS in camera bianca⌗
1. Comprensione completa del sistema⌗
Ogni componente è noto e compreso.
Non ci sono dipendenze opache o comportamenti nascosti.
2. Modello di sicurezza più forte⌗
Con una TCB più piccola e controllata:
- esistono meno superfici d’attacco
- gli invarianti sono più facili da far rispettare
- la sicurezza basata su capacità può essere implementata in modo pulito
3. Migliore piattaforma di ricerca⌗
EriX non è solo un sistema operativo: è anche una piattaforma di ricerca.
Lo sviluppo in camera bianca consente:
- sperimentazione con nuove astrazioni
- misurazione precisa dei compromessi di progettazione
- ragionamento chiaro su autorità e isolamento
4. Manutenibilità a lungo termine⌗
Sebbene inizialmente richiedano più lavoro, i sistemi in camera bianca possono essere più facili da mantenere:
- nessuna rottura delle dipendenze
- nessun cambiamento upstream da seguire
- nessun conflitto di versione
Il sistema evolve secondo i propri termini.
Compromessi e sfide⌗
Lo sviluppo in camera bianca non è privo di costi.
1. Sviluppo più lento⌗
Tutto deve essere costruito da zero:
- librerie di base
- supporto runtime
- servizi di sistema
Questo aumenta significativamente lo sforzo iniziale.
2. Reinventare la ruota⌗
Molti problemi sono già stati risolti altrove.
Reimplementarli richiede tempo e progettazione attenta.
3. Meno scorciatoie⌗
Non c’è la possibilità di:
- importare rapidamente una libreria
- fare affidamento su ecosistemi esistenti
- delegare complessità a codice esterno
Tutta la complessità deve essere gestita direttamente.
4. Maggiore responsabilità di progettazione⌗
Ogni astrazione deve essere progettata deliberatamente.
Gli errori non possono essere facilmente coperti sostituendo dipendenze.
Perché questo approccio si adatta a EriX⌗
EriX è costruito intorno ad alcuni principi fondamentali:
- base di calcolo fidata minima
- autorità esplicita tramite capacità
- separazione rigorosa tra kernel e spazio utente
- riproducibilità e determinismo
Lo sviluppo in camera bianca supporta tutti questi obiettivi.
Garantisce che:
- l’autorità non sia mai nascosta dentro codice esterno
- gli invarianti del sistema siano completamente controllati
- l’architettura rimanga coerente in tutti i componenti
Una base per il self-hosting⌗
La progettazione in camera bianca supporta anche l’obiettivo a lungo termine del self-hosting.
Per costruire EriX dentro EriX, il sistema deve includere:
- la propria toolchain
- le proprie librerie runtime
- le proprie interfacce di sistema
Un sistema che dipende fortemente da componenti esterni faticherebbe a raggiungere questo livello di indipendenza.
Guardando avanti⌗
Progettare un sistema operativo in camera bianca è uno sforzo a lungo termine. Richiede pianificazione attenta, implementazione disciplinata e disponibilità a costruire componenti fondamentali da zero.
Ma crea anche un sistema che è:
- trasparente
- controllato
- compreso in profondità
Nei prossimi articoli passeremo dai principi all’implementazione, iniziando dal processo di boot iniziale e dal design del formato dell’immagine di boot del sistema.