Dissenyar un sistema operatiu de sala neta
La majoria de sistemes operatius moderns es construeixen sobre dècades de codi acumulat, biblioteques i dependències externes. Tot i que aquest ecosistema permet un desenvolupament ràpid, també introdueix complexitat, supòsits ocults i riscos de seguretat potencialment no examinats.
EriX adopta un enfocament diferent.
Es desenvolupa com un sistema operatiu de sala neta, cosa que significa que cada component - des del carregador d’arrencada fins als serveis d’espai d’usuari - s’implementa dins del mateix projecte, sense incorporar codi font extern ni biblioteques de tercers.
Aquest article explora què significa el desenvolupament de sala neta a la pràctica, per què és útil i quins compromisos introdueix.
Què significa “sala neta”?⌗
En el context d’EriX, el desenvolupament de sala neta significa:
- No es copia ni es reutilitza codi font extern
- No s’inclouen biblioteques ni crates de tercers
- Tots els components s’implementen dins del projecte
- Només es poden consultar especificacions i documentació públiques
El resultat és un sistema en què cada línia de codi és:
- entesa
- auditable
- dissenyada intencionadament
Això no és només una decisió legal o de llicències; és una decisió arquitectònica.
Per què evitar codi extern?⌗
Evitar dependències externes pot semblar restrictiu. El desenvolupament modern de programari normalment fomenta la reutilització, i els grans ecosistemes existeixen precisament per evitar reinventar la roda.
Tanmateix, els sistemes operatius no són aplicacions típiques.
1. Complexitat oculta⌗
El codi extern sovint porta supòsits implícits:
- sobre la disposició de memòria
- sobre els models de concurrència
- sobre la gestió d’errors
- sobre el comportament de la plataforma
Aquests supòsits poden no encaixar amb l’arquitectura d’un nou sistema operatiu, especialment un construït al voltant de capacitats i aïllament estricte.
2. Base de computació de confiança (TCB) ampliada⌗
Cada dependència augmenta la mida de la base de computació de confiança.
Si s’utilitza una biblioteca de tercers al nucli o en components crítics del sistema, la seva correcció passa a formar part de les garanties de seguretat del sistema.
El desenvolupament de sala neta manté la TCB:
- petita
- controlada
- definida explícitament
3. Auditabilitat i verificació⌗
Un sistema construït íntegrament internament es pot auditar sistemàticament.
- Es pot revisar tot el codi unsafe
- Es poden documentar tots els invariants
- Es pot raonar sobre totes les interfícies
Això és especialment important per a un sistema com EriX, que posa l’èmfasi en:
- autoritat explícita
- seguretat basada en capacitats
- disseny mínim del nucli
4. Llibertat arquitectònica⌗
Reutilitzar codi existent sovint restringeix les decisions de disseny.
Per exemple:
- adoptar una biblioteca pot imposar una forma concreta d’API
- integrar codi existent pot requerir capes de compatibilitat
- les abstraccions heretades poden filtrar-se als nous components
El desenvolupament de sala neta permet que el sistema es modeli completament segons els seus propis principis, en lloc de restriccions heretades.
Sala neta vs. reimplementació⌗
És important distingir el desenvolupament de sala neta d’una simple reimplementació.
El desenvolupament de sala neta no vol dir reescriure sistemes existents a cegues.
En canvi, implica:
- estudiar especificacions públiques
- entendre els principis subjacents
- dissenyar noves implementacions des de primers principis
Per exemple:
- Un sistema de fitxers pot seguir la semàntica POSIX, però implementar-se de manera independent
- Un carregador d’arrencada pot seguir les especificacions UEFI, però utilitzar una estructura personalitzada
- Una biblioteca estàndard de C pot exposar la mateixa API, però estar escrita íntegrament en Rust
L’objectiu és la compatibilitat quan cal, sense reutilització de codi.
Sala neta a la pràctica⌗
A EriX, les restriccions de sala neta s’apliquen a tot el sistema.
Sense crates externs⌗
Fins i tot en Rust, on la reutilització de dependències és comuna, EriX evita els crates externs.
En canvi, defineix components reutilitzables interns com ara:
- utilitats de memòria
- primitives de sincronització
- abstraccions de capacitats
Biblioteques internes⌗
La funcionalitat reutilitzable s’organitza en crates interns, per exemple:
lib-bootimglib-capabilib-ipc
Aquestes biblioteques són:
- versionades
- controlades dins del projecte
- dissenyades específicament per a les necessitats del sistema
Estructura estricta del repositori⌗
Cada subsistema està aïllat:
- carregador d’arrencada
- nucli
- IPC
- gestió de memòria
- serveis d’espai d’usuari
Això imposa modularitat i evita acoblaments ocults.
Compilacions reproduïbles⌗
El disseny de sala neta també s’estén al procés de compilació.
El sistema aspira a:
- compilacions deterministes
- supòsits mínims sobre la cadena d’eines
- passos de compilació explícits
Això garanteix que els artefactes es puguin reproduir i verificar.
Beneficis d’un sistema operatiu de sala neta⌗
1. Comprensió completa del sistema⌗
Cada component és conegut i entès.
No hi ha dependències opaques ni comportaments ocults.
2. Model de seguretat més fort⌗
Amb una TCB més petita i controlada:
- hi ha menys superfícies d’atac
- els invariants són més fàcils de fer complir
- la seguretat basada en capacitats es pot implementar netament
3. Millor plataforma de recerca⌗
EriX no és només un sistema operatiu; també és una plataforma de recerca.
El desenvolupament de sala neta permet:
- experimentar amb noves abstraccions
- mesurar amb precisió els compromisos de disseny
- raonar clarament sobre autoritat i aïllament
4. Mantenibilitat a llarg termini⌗
Tot i que inicialment requereix més feina, els sistemes de sala neta poden ser més fàcils de mantenir:
- sense trencaments de dependències
- sense canvis upstream a seguir
- sense conflictes de versions
El sistema evoluciona en els seus propis termes.
Compromisos i reptes⌗
El desenvolupament de sala neta no és gratuït.
1. Desenvolupament més lent⌗
Tot s’ha de construir des de zero:
- biblioteques bàsiques
- suport de runtime
- serveis del sistema
Això incrementa significativament l’esforç inicial.
2. Reinventar la roda⌗
Molts problemes ja s’han resolt en altres llocs.
Reimplementar-los requereix temps i un disseny acurat.
3. Menys dreceres⌗
No hi ha la possibilitat de:
- importar ràpidament una biblioteca
- confiar en ecosistemes existents
- delegar complexitat a codi extern
Tota la complexitat s’ha de gestionar directament.
4. Més responsabilitat de disseny⌗
Cada abstracció s’ha de dissenyar deliberadament.
Els errors no es poden tapar fàcilment canviant dependències.
Per què aquest enfocament encaixa amb EriX⌗
EriX es construeix al voltant d’uns quants principis centrals:
- base de computació de confiança mínima
- autoritat explícita mitjançant capacitats
- separació estricta entre nucli i espai d’usuari
- reproduïbilitat i determinisme
El desenvolupament de sala neta dona suport a tots aquests objectius.
Garanteix que:
- l’autoritat mai no quedi amagada dins de codi extern
- els invariants del sistema estiguin completament controlats
- l’arquitectura es mantingui coherent en tots els components
Una base per al self-hosting⌗
El disseny de sala neta també dona suport a l’objectiu a llarg termini del self-hosting.
Per construir EriX dins d’EriX, el sistema ha d’incloure:
- la seva pròpia cadena d’eines
- les seves pròpies biblioteques de runtime
- les seves pròpies interfícies de sistema
Un sistema que depèn fortament de components externs tindria dificultats per assolir aquest nivell d’independència.
Mirant endavant⌗
Dissenyar un sistema operatiu de sala neta és un esforç a llarg termini. Requereix planificació acurada, implementació disciplinada i voluntat de construir components fonamentals des de zero.
Però també crea un sistema que és:
- transparent
- controlat
- profundament entès
En articles futurs passarem dels principis a la implementació, començant pel procés d’arrencada inicial i el disseny del format d’imatge d’arrencada del sistema.