Att utforma ett renrumsoperativsystem
De flesta moderna operativsystem bygger på årtionden av ackumulerad kod, bibliotek och externa beroenden. Även om detta ekosystem möjliggör snabb utveckling för det också med sig komplexitet, dolda antaganden och potentiellt ogranskade säkerhetsrisker.
EriX använder ett annat angreppssätt.
Det utvecklas som ett renrumsoperativsystem, vilket innebär att varje komponent - från starthanteraren till tjänster i användarrymden - implementeras inom projektet självt, utan att extern källkod eller tredjepartsbibliotek tas in.
Detta inlägg utforskar vad renrumsutveckling innebär i praktiken, varför den är användbar och vilka kompromisser den medför.
Vad betyder “renrum”?⌗
I EriX sammanhang innebär renrumsutveckling:
- Ingen extern källkod kopieras eller återanvänds
- Inga tredjepartsbibliotek eller crates inkluderas
- Alla komponenter implementeras inom projektet
- Endast offentliga specifikationer och dokumentation får användas som referens
Resultatet är ett system där varje kodrad är:
- förstådd
- granskningsbar
- avsiktligt utformad
Detta är inte bara ett juridiskt beslut eller ett licensbeslut - det är ett arkitekturbeslut.
Varför undvika extern kod?⌗
Att undvika externa beroenden kan verka begränsande. Modern programvaruutveckling uppmuntrar vanligtvis återanvändning, och stora ekosystem finns just för att undvika att uppfinna hjulet på nytt.
Operativsystem är dock inte vanliga applikationer.
1. Dold komplexitet⌗
Extern kod för ofta med sig implicita antaganden:
- om minneslayout
- om parallellitetsmodeller
- om felhantering
- om plattformsbeteende
Dessa antaganden kanske inte stämmer med arkitekturen hos ett nytt operativsystem, särskilt ett som byggs kring kapabiliteter och strikt isolering.
2. Större betrodd beräkningsbas (TCB)⌗
Varje beroende ökar storleken på den betrodda beräkningsbasen.
Om ett tredjepartsbibliotek används i kärnan eller i kritiska systemkomponenter blir dess korrekthet en del av systemets säkerhetsgarantier.
Renrumsutveckling håller TCB:
- liten
- kontrollerad
- explicit definierad
3. Granskningsbarhet och verifiering⌗
Ett system som byggs helt internt kan granskas systematiskt.
- All unsafe-kod kan granskas
- Alla invarianter kan dokumenteras
- Alla gränssnitt kan resoneras om
Detta är särskilt viktigt för ett system som EriX, som betonar:
- explicit auktoritet
- kapabilitetsbaserad säkerhet
- minimal kärndesign
4. Arkitektonisk frihet⌗
Återanvändning av befintlig kod begränsar ofta designbeslut.
Till exempel:
- ett bibliotek kan tvinga fram en viss API-form
- integrering av befintlig kod kan kräva kompatibilitetslager
- äldre abstraktioner kan läcka in i nya komponenter
Renrumsutveckling gör att systemet kan formas helt av sina egna principer, i stället för av ärvda begränsningar.
Renrum kontra återimplementering⌗
Det är viktigt att skilja renrumsutveckling från enkel återimplementering.
Renrumsutveckling betyder inte att befintliga system skrivs om blint.
I stället innebär det:
- att studera offentliga specifikationer
- att förstå underliggande principer
- att utforma nya implementationer från första principer
Till exempel:
- Ett filsystem kan följa POSIX-semantik, men implementeras oberoende
- En starthanterare kan följa UEFI-specifikationer, men använda en egen struktur
- Ett C-standardbibliotek kan exponera samma API, men vara skrivet helt i Rust
Målet är kompatibilitet där den behövs, utan återanvändning av kod.
Renrum i praktiken⌗
I EriX tillämpas renrumsbegränsningar över hela systemet.
Inga externa crates⌗
Även i Rust, där återanvändning av beroenden är vanligt, undviker EriX externa crates.
I stället definierar systemet interna återanvändbara komponenter såsom:
- minnesverktyg
- synkroniseringsprimitiver
- kapabilitetsabstraktioner
Interna bibliotek⌗
Återanvändbar funktionalitet organiseras i interna crates, till exempel:
lib-bootimglib-capabilib-ipc
Dessa bibliotek är:
- versionerade
- kontrollerade inom projektet
- utformade specifikt för systemets behov
Strikt repositorystruktur⌗
Varje subsystem är isolerat:
- starthanterare
- kärna
- IPC
- minneshantering
- tjänster i användarrymden
Detta tvingar fram modularitet och förhindrar dold koppling.
Reproducerbara byggen⌗
Renrumsdesign sträcker sig även till byggprocessen.
Systemet eftersträvar:
- deterministiska byggen
- minimala antaganden om verktygskedjan
- explicita byggsteg
Detta säkerställer att artefakter kan reproduceras och verifieras.
Fördelar med ett renrums-OS⌗
1. Full förståelse av systemet⌗
Varje komponent är känd och förstådd.
Det finns inga ogenomskinliga beroenden eller dolda beteenden.
2. Starkare säkerhetsmodell⌗
Med en mindre och kontrollerad TCB:
- finns färre angreppsytor
- är invarianter lättare att upprätthålla
- kan kapabilitetsbaserad säkerhet implementeras rent
3. Bättre forskningsplattform⌗
EriX är inte bara ett operativsystem - det är också en forskningsplattform.
Renrumsutveckling möjliggör:
- experiment med nya abstraktioner
- precis mätning av designkompromisser
- tydligt resonemang om auktoritet och isolering
4. Långsiktig underhållbarhet⌗
Även om det innebär mer arbete i början kan renrumssystem vara enklare att underhålla:
- inga beroenden som går sönder
- inga uppströmsändringar att följa
- inga versionskonflikter
Systemet utvecklas på sina egna villkor.
Kompromisser och utmaningar⌗
Renrumsutveckling är inte utan kostnad.
1. Långsammare utveckling⌗
Allt måste byggas från grunden:
- grundläggande bibliotek
- runtime-stöd
- systemtjänster
Detta ökar den initiala arbetsinsatsen avsevärt.
2. Att uppfinna hjulet på nytt⌗
Många problem har redan lösts någon annanstans.
Att återimplementera dem kräver tid och noggrann design.
3. Färre genvägar⌗
Det finns ingen möjlighet att:
- snabbt importera ett bibliotek
- förlita sig på befintliga ekosystem
- delegera komplexitet till extern kod
All komplexitet måste hanteras direkt.
4. Större designansvar⌗
Varje abstraktion måste utformas medvetet.
Misstag kan inte enkelt döljas genom att byta beroenden.
Varför detta angreppssätt passar EriX⌗
EriX bygger på några kärnprinciper:
- minimal betrodd beräkningsbas
- explicit auktoritet genom kapabiliteter
- strikt separation mellan kärna och användarrymd
- reproducerbarhet och determinism
Renrumsutveckling stöder alla dessa mål.
Den säkerställer att:
- auktoritet aldrig döljs i extern kod
- systemets invarianter är helt kontrollerade
- arkitekturen förblir konsekvent över alla komponenter
En grund för självhosting⌗
Renrumsdesign stöder också det långsiktiga målet självhosting.
För att bygga EriX inuti EriX måste systemet innehålla:
- sin egen verktygskedja
- sina egna runtime-bibliotek
- sina egna systemgränssnitt
Ett system som är starkt beroende av externa komponenter skulle ha svårt att uppnå denna nivå av oberoende.
Framåt⌗
Att utforma ett renrumsoperativsystem är en långsiktig insats. Det kräver noggrann planering, disciplinerad implementation och en vilja att bygga grundläggande komponenter från grunden.
Men det skapar också ett system som är:
- transparent
- kontrollerat
- djupt förstått
I framtida inlägg går vi från principer till implementation, med början i den tidiga startprocessen och designen av systemets boot image-format.