Sistemele de operare sunt printre cele mai complexe componente informatice construite vreodată. Ele gestionează memoria, planifică execuția, controlează echipamentul și aplică granițele de securitate care protejează fiecare aplicație ce rulează pe o mașină.

Totuși, multe dintre sistemele de operare pe care ne bazăm astăzi sunt construite pe idei arhitecturale vechi de câteva decenii. Deși aceste sisteme sunt extraordinar de puternice și testate în practică, ele poartă și decenii de complexitate acumulată.

Acest proiect explorează o direcție diferită: construirea unui sistem de operare modern, cu micronucleu bazat pe capabilități, de la zero, cu accent puternic pe autoritate explicită, bază de calcul de încredere (TCB) minimă și separare strictă între nucleu și spațiul utilizator.

Acest sistem de operare se numește EriX.


De ce să construiești încă un sistem de operare?

La prima vedere, construirea unui nou sistem de operare pare inutilă. Sisteme mature precum Linux, Windows și BSD există deja și rulează pe miliarde de dispozitive.

Totuși, aceste sisteme au evoluat sub constrângeri istorice. În timp, au acumulat straturi de abstracții, mecanisme de compatibilitate și interfețe moștenite. Deși aceste elemente sunt adesea necesare în programele real, ele fac și mai dificilă experimentarea unor idei arhitecturale fundamental diferite.

Sistemele de operare de cercetare au explorat de mult timp abordări alternative ale proiectării sistemelor de operare. Micronucleele, sistemele bazate pe capabilități și nucleele verificate formal au demonstrat că este posibil să construiești sisteme mai mici, mai sigure și mai ușor de analizat.

Scopul EriX nu este să înlocuiască sistemele de operare existente. Mai degrabă, este o explorare a modului în care ar putea fi proiectat un sistem de operare modern dacă pornim de la prime principii.


Micronucleele și baza de calcul de încredere

Una dintre ideile centrale din spatele EriX este arhitectura de micronucleu.

Nucleele monolitice tradiționale includ multe servicii direct în nucleu. Acestea includ adesea:

  • controlere de dispozitiv
  • sisteme de fișiere
  • stive de rețea
  • subsisteme de management al proceselor

Deși această abordare poate fi eficientă, ea mărește și dimensiunea bazei de calcul de încredere (TCB). TCB include fiecare componentă de cod care trebuie să se comporte corect pentru ca sistemul să rămână sigur și fiabil.

Micronucleele adoptă o abordare diferită.

Un micronucleu păstrează în nucleu doar mecanismele cele mai fundamentale, în mod tipic:

  • planificarea firelor de execuție
  • gestionarea spațiului de adrese
  • comunicarea inter-proces (IPC)
  • gestionarea capabilităților
  • tratarea întreruperilor și excepțiilor

Tot restul rulează în spațiul utilizator, inclusiv controlere, sisteme de fișiere și servicii de nivel mai înalt.

Această proiectare reduce drastic cantitatea de cod în care trebuie să avem încredere. Defectele în componentele din spațiul utilizator au șanse mai mici să compromită întregul sistem, iar componentele individuale pot fi repornite sau înlocuite fără a opri nucleul.


Securitate bazată pe capabilități

Un alt principiu central de proiectare al EriX este securitatea bazată pe capabilități.

Majoritatea sistemelor de operare se bazează puternic pe autoritate ambientală. În aceste sisteme, procesele au adesea acces implicit la resurse pe baza spațiilor de nume globale, a identităților de utilizator sau a privilegiilor moștenite.

De exemplu, un proces poate deschide un fișier doar pentru că îi cunoaște calea, iar sistemul de operare decide că procesul are permisiunea necesară.

Sistemele cu capabilități adoptă o abordare diferită.

O capabilitate este un token nefalsificabil care oferă acces la un obiect specific, cu drepturi specifice. Un proces poate accesa un obiect doar dacă posedă o capabilitate care autorizează acel acces.

Capabilitățile au mai multe proprietăți importante:

  • Reprezintă autoritatea în mod explicit.
  • Pot fi transferate între procese.
  • Pot restricționa operațiile la un set precis de drepturi.

Într-un sistem bazat pe capabilități, autoritatea circulă prin transferuri explicite, nu prin spații de nume globale. Acest lucru face sistemul mai ușor de analizat și ajută la eliminarea unor clase întregi de vulnerabilități de securitate.


De ce Rust?

Sistemele de operare sunt scrise tradițional în C sau assembly. Aceste limbaje oferă control precis asupra echipamentului și memoriei, dar fac și ușoară introducerea unor bug-uri subtile.

Bug-urile de siguranță a memoriei, cum ar fi utilizare după eliberare, depășirile de tampon și cursele de date, au fost istoric una dintre cele mai mari surse de vulnerabilități în programele de sistem.

EriX este scris în principal în Rust.

Rust oferă garanții puternice privind siguranța memoriei, permițând în același timp control de nivel jos asupra echipamentului. Modelul de proprietate al limbajului ajută la prevenirea multor clase de bug-uri la compilare, în timp ce blocurile unsafe explicite fac operațiile potențial periculoase vizibile și auditabile.

Folosirea Rust nu elimină toate erorile posibile, dar ridică semnificativ nivelul minim de siguranță în programarea de sistem.


Un sistem de operare de tip cameră curată

Un aspect neobișnuit al proiectului EriX este abordarea sa de dezvoltare în cameră curată.

Toate componentele sistemului sunt implementate în interiorul proiectului. Nu este copiat sau incorporat cod sursă extern și nu sunt folosite biblioteci de terță parte.

Această constrângere are mai multe scopuri:

  • Asigură că întregul sistem poate fi înțeles și auditat.
  • Evită dependențele ascunse și comportamentele neașteptate.
  • Forțează deciziile arhitecturale să fie explicite, nu moștenite.

Dezvoltarea în cameră curată transformă proiectul și într-un exercițiu educațional. Fiecare subsistem, de la încărcător de pornire la managerul de memorie, trebuie proiectat și implementat deliberat.


Un obiectiv pe termen lung: auto-găzduire

Unul dintre obiectivele pe termen lung ale EriX este auto-găzduire.

Un sistem este considerat auto-găzduit atunci când își poate construi propriul cod sursă folosind unelte care rulează pe sistemul însuși.

Pentru EriX, acest lucru înseamnă că, în cele din urmă:

  • compilatorul Rust rulează pe EriX
  • uneltele de compilare rulează pe EriX
  • întregul sistem de operare poate fi compilat nativ în EriX

Atingerea acestui prag necesită implementarea multor straturi de infrastructură, inclusiv sisteme de fișiere, management de procese și un mediu în spațiul utilizator compatibil POSIX.


De ce să documentezi parcursul?

Construirea unui sistem de operare este un proces lung și complex. Multe dintre perspectivele cele mai interesante nu apar în sistemul final, ci în deciziile, compromisurile și greșelile întâlnite pe parcurs.

Acest blog documentează dezvoltarea EriX pe măsură ce evoluează. Postările viitoare vor acoperi subiecte precum:

  • proiectarea unui format de imagine de pornire
  • implementarea spațiilor de capabilități
  • construirea unui sistem IPC
  • gestionarea autorității asupra memoriei
  • construirea serverelor din spațiul utilizator

Scopul este de a face procesul de dezvoltare transparent și educațional.


Privind înainte

EriX este încă într-o fază timpurie. O mare parte din sistem rămâne de construit, iar multe decizii de proiectare vor evolua fără îndoială în timp.

Dar principiile directoare sunt deja clare:

  • nucleu minim
  • autoritate explicită
  • securitate bazată pe capabilități
  • modularitate strictă
  • implementare în cameră curată

În următoarea postare vom explora una dintre ideile de bază ale sistemului:

ce sunt sistemele de operare bazate pe capabilități și de ce contează.