Les systèmes d’exploitation font partie des logiciels les plus complexes jamais construits. Ils gèrent la mémoire, planifient le calcul, contrôlent le matériel et appliquent les frontières de sécurité qui protègent chaque application exécutée sur une machine.

Pourtant, beaucoup des systèmes d’exploitation sur lesquels nous comptons aujourd’hui reposent sur des idées d’architecture datant de plusieurs décennies. Bien que ces systèmes soient extraordinairement puissants et éprouvés, ils portent aussi des décennies de complexité accumulée.

Ce projet explore une autre direction : construire un système d’exploitation moderne à micro-noyau, basé sur les capacités, depuis zéro, avec un fort accent sur l’autorité explicite, une base de calcul de confiance (TCB) minimale, et une séparation stricte entre noyau et espace utilisateur.

Ce système d’exploitation s’appelle EriX.


Pourquoi construire un autre système d’exploitation ?

À première vue, construire un nouveau système d’exploitation paraît inutile. Des systèmes matures comme Linux, Windows et BSD existent déjà et font tourner des milliards d’appareils.

Cependant, ces systèmes ont évolué sous des contraintes historiques. Au fil du temps, ils ont accumulé des couches d’abstractions, des mécanismes de compatibilité et des interfaces héritées. Même si ces fonctionnalités sont souvent nécessaires en pratique, elles rendent aussi difficile l’expérimentation d’idées architecturales fondamentalement différentes.

Les systèmes d’exploitation de recherche explorent depuis longtemps des approches alternatives de conception des systèmes d’exploitation. Les micro-noyaux, les systèmes à capacités et les noyaux formellement vérifiés ont montré qu’il est possible de construire des systèmes plus petits, plus sûrs et plus faciles à raisonner.

L’objectif d’EriX n’est pas de remplacer les systèmes d’exploitation existants. C’est plutôt une exploration de la manière dont un système d’exploitation moderne pourrait être conçu si l’on partait de premiers principes.


Micro-noyaux et base de calcul de confiance

L’une des idées centrales derrière EriX est l’architecture micro-noyau.

Les noyaux monolithiques traditionnels incluent de nombreux services directement à l’intérieur du noyau lui-même. Cela inclut souvent :

  • les pilotes de périphériques
  • les systèmes de fichiers
  • les piles réseau
  • les sous-systèmes de gestion des processus

Si cette approche peut être efficace, elle augmente aussi la taille de la base de calcul de confiance (TCB). La TCB inclut chaque portion de code qui doit se comporter correctement pour que le système reste sûr et fiable.

Les micro-noyaux adoptent une approche différente.

Un micro-noyau conserve dans le noyau uniquement les mécanismes les plus fondamentaux, notamment :

  • l’ordonnancement des fils d’exécution
  • la gestion de l’espace d’adressage
  • la communication inter-processus (IPC)
  • la gestion des capacités
  • la gestion des interruptions et des exceptions

Tout le reste s’exécute en espace utilisateur, y compris les pilotes, les systèmes de fichiers et les services de plus haut niveau.

Cette conception réduit drastiquement la quantité de code à laquelle il faut faire confiance. Les défaillances des composants en espace utilisateur ont moins de chances de compromettre l’ensemble du système, et les composants individuels peuvent être redémarrés ou remplacés sans faire tomber le noyau.


Sécurité basée sur les capacités

Un autre principe de conception central d’EriX est la sécurité basée sur les capacités.

La plupart des systèmes d’exploitation reposent fortement sur l’autorité ambiante. Dans ces systèmes, les processus ont souvent un accès implicite aux ressources en fonction d’espaces de noms globaux, d’identités utilisateur ou de privilèges hérités.

Par exemple, un processus peut ouvrir un fichier simplement parce qu’il connaît son chemin et que le système d’exploitation décide qu’il a la permission d’y accéder.

Les systèmes à capacités adoptent une approche différente.

Une capacité est un jeton infalsifiable qui accorde l’accès à un objet spécifique avec des droits spécifiques. Un processus ne peut accéder à un objet que s’il possède une capacité qui autorise cet accès.

Les capacités ont plusieurs propriétés importantes :

  • Elles représentent l’autorité explicitement.
  • Elles peuvent être transférées entre processus.
  • Elles peuvent restreindre les opérations à un ensemble précis de droits.

Dans un système basé sur les capacités, l’autorité circule par des transferts explicites plutôt que par des espaces de noms globaux. Cela rend le système plus facile à raisonner et aide à éliminer des classes entières de vulnérabilités de sécurité.


Pourquoi Rust ?

Les systèmes d’exploitation sont traditionnellement écrits en C ou en assembleur. Ces langages offrent un contrôle précis du matériel et de la mémoire, mais ils rendent aussi facile l’introduction de bogues subtils.

Les bogues de sûreté mémoire, comme utilisation après libération, les dépassements de tampon et les courses de données, ont historiquement été l’une des plus grandes sources de vulnérabilités dans les logiciels systèmes.

EriX est principalement écrit en Rust.

Rust fournit de fortes garanties de sûreté mémoire tout en permettant un contrôle bas niveau du matériel. Le modèle de propriété du langage aide à prévenir de nombreuses classes de bogues à la compilation, tandis que ses blocs unsafe explicites rendent visibles et auditables les opérations potentiellement dangereuses.

Utiliser Rust n’élimine pas toutes les erreurs possibles, mais augmente considérablement le niveau de sûreté de base en programmation système.


Un système d’exploitation en salle blanche

Un aspect inhabituel du projet EriX est son approche de développement en salle blanche.

Tous les composants du système sont implémentés au sein du projet lui-même. Aucun code source externe n’est copié ou incorporé, et aucune bibliothèque de tierce partie n’est utilisée.

Cette contrainte sert plusieurs objectifs :

  • Elle garantit que l’ensemble du système peut être compris et audité.
  • Elle évite les dépendances cachées et les comportements inattendus.
  • Elle force des décisions d’architecture explicites plutôt qu’héritées.

Le développement en salle blanche transforme aussi le projet en exercice pédagogique. Chaque sous-système, du chargeur d’amorçage au gestionnaire mémoire, doit être conçu et implémenté délibérément.


Un objectif à long terme : l’auto-hébergement

L’un des objectifs à long terme d’EriX est l’auto-hébergement.

Un système est dit auto-hébergé lorsqu’il peut compiler son propre code source avec des outils qui s’exécutent sur le système lui-même.

Pour EriX, cela signifie qu’à terme :

  • le compilateur Rust s’exécute sur EriX
  • les outils de compilation s’exécutent sur EriX
  • l’ensemble du système d’exploitation peut être compilé nativement dans EriX

Atteindre cette étape nécessite d’implémenter de nombreuses couches infrastructurelles, notamment les systèmes de fichiers, la gestion des processus et un environnement utilisateur compatible POSIX.


Pourquoi documenter le parcours ?

Construire un système d’exploitation est un processus long et complexe. Beaucoup des idées les plus intéressantes n’apparaissent pas dans le système final, mais dans les décisions, compromis et erreurs rencontrés en chemin.

Ce blog documente le développement d’EriX à mesure qu’il évolue. Les prochains articles couvriront des sujets comme :

  • la conception d’un format d’image de démarrage
  • l’implémentation d’espaces de capacités
  • la construction d’un système IPC
  • la gestion de l’autorité mémoire
  • la construction de serveurs en espace utilisateur

L’objectif est de rendre le processus de développement transparent et pédagogique.


Et la suite

EriX en est encore à ses débuts. Une grande partie du système reste à construire, et de nombreuses décisions de conception évolueront sans doute avec le temps.

Mais les principes directeurs sont déjà clairs :

  • noyau minimal
  • autorité explicite
  • sécurité basée sur les capacités
  • modularité stricte
  • implémentation en salle blanche

Dans le prochain article, nous explorerons l’une des idées fondamentales du système :

ce que sont les systèmes d’exploitation basés sur les capacités, et pourquoi ils comptent.