# Exo-noyau

Un exo-noyau ou exokernel est un type de système d’exploitation dont l'architecture logicielle est dite modulaire. En informatique, un noyau ou kernel est le premier élément codé venant exploiter les ressources matérielles de l'ordinateur. Il existe différents types de noyaux qui supportent des systèmes d’exploitations et qui fournissent des mécanismes d’abstraction du matériel tel que la mémoire, le (ou les) processeur(s), le réseau informatique ou les différents périphériques matériels. Le noyau facilite également la communication entre les processus grâce à diverses abstractions logicielles.
Contrairement aux noyaux dit monolithiques, l'exo-noyau et son architecture ont une approche plus radicale. ἔξω (éxo) signifie en grec ancien « hors de » : un exo-noyau est donc un système fonctionnant dans l’espace utilisateur et non dans l’espace noyau. La philosophie de l'exo-noyau est : l’élimination de toute abstraction d'un système d'exploitation pour que l'utilisateur soit au plus près du matériel. C'est en 1995 qu'une équipe du MIT (Massachusetts Institute of Technology) commence son étude et le développement de ce type de noyau ; initiant en même temps de vifs débats avec les tenants des noyaux monolithiques. La philosophie et les principes définis pour ce projet ont modifié la vision de la performance, la gestion des ressources matérielles et la sécurité au sein d'un système d’exploitation. Les instanciations et l'utilisation de l'exo-noyau ainsi que des outils et applications spécifiques n'ont cessé de se multiplier et d'évoluer depuis sa genèse.

## Motivations

Les problèmes qu’apportent l'abstraction des ressources matérielles d'un système monolithique sont les suivants$^,$ :

### Manque de fiabilité

    À cause d'un code lourd et des mécanismes complexes, la performance d'un système dit monolithique est dégradée.

### Manque d’adaptabilité

    Le code dense empêche une évolution simplifiée. D'autre part, les applications dépendant fortement d'un système d'exploitation, celles-ci sont difficilement adaptables au détriment des autres.

### Performance en retrait

    À cause des abstractions matérielles excessives, les programmes se trouvent loin des ressources et les applications n'utilisant pas ces abstractions en pâtissent. L'OS unique cherche à faire un compromis pénalisant une application au détriment d'une autre.

### Manque de flexibilité

    Si les applications pouvaient passer outre au système d'exploitation et implémenter leurs propres abstractions, leur flexibilité serait acceptable. Il n'en est rien car cette méthode serait trop coûteuse, compliquée et mal à propos selon la philosophie d'un système monolithique.
De ce fait, les applications ne pouvant pas faire abstraction de la couche OS, l'ensemble est lent, inflexible et instable.
Les buts de l'exo-noyau sont clairement établis$^,$$^,$ :
* Donner aux utilisateurs un système au code léger et simple pour que les performances soient au rendez-vous;
* Permettre aux développeurs de disposer d'un environnement propice aux évolutions;
* Rapprocher les applications au maximum de la couche matérielle pour optimiser les performances;
* Permettre aux programmes de définir eux-mêmes leurs abstractions matérielles.

## Philosophie et Principes

La philosophie et les principes de l'exo-noyau sont établis par l'équipe du MIT (Massachusetts Institute of Technology) travaillant sur son étude et son développement. Ceux-ci sont repris et mis en œuvre au sein de son architecture modulaire :

### Séparation de la sécurité (protection) et de la gestion des ressources

L'exo-noyau limite la gestion des ressources à des fonctions nécessaires à la sécurité : allocation, révocation, partage et droits. Les applications ayant accès à l’ensemble des mécanismes du système, sauf la sécurité, l'évolutivité du noyau est optimisé$^,$$^,$$^,$$^,$$^,$.

### Exposition du matériel

Les applications ont accès à l'ensemble des ressources matérielles en empruntant des liens sécurisés. Elles ont une vue complète des paramètres du matériel. Le niveau d'accès est le plus bas qu'on puisse donner de manière sécurisée$^,$.

### Exposition de l'allocation

L'exo-noyau permet aux applications de solliciter le matériel durant la phase d'allocation en leur donnant le contrôle du niveau d'abstraction et de performance$^,$.

### Exposition de l’acquittement

L'exo-noyau donne aux applications l'accès aux règles et politiques d'acquittement. Le contrôle de la libération des ressources est total$^,$$^,$$^,$.

### Une protection au niveau le plus bas

Pour alléger efficacement la gestion et le partage des ressources, l'exo-noyau place son niveau d'action le plus bas possible. Exemple d'un disque-dur : l'accès est donné au niveau des blocs (gestion en mode bloc) du disque au lieu des partitions car celles-ci constituent déjà une abstraction de haut-niveau.

### Exposition des noms

L'exo-noyau utilise au maximum le nom physique des ressources. L'utilisation d'alias ou d'éléments virtuels alourdit les processus et coûte du temps$^,$.

### Exposition de l'information

L'exo-noyau expose toutes les informations du niveau matériel aux applications. Les programmes ont donc une vue parfaite des ressources utilisées ou libres. Les noyaux monolithiques ne montrent qu'une partie de l'information ou de manière déguisée, ce qui nuit à la souplesse et la performance$^,$$^,$.

## Historique
### Le MIT et l'exo-noyau

Dans les années 1990, certains chercheurs du MIT (Massachusetts Institute of Technology) se sont penchés sur les systèmes d'exploitations monolithiques actuels qui, selon eux, soulèvent plusieurs problèmes de conception dus à la volonté d'abstraction des ressources physiques d'un ordinateur. Le résultat de cette approche : une performance, une adaptabilité et une flexibilité qui sont en retraits.
La solution : l’élimination complète des abstractions engendrées par un système d'exploitation!
C'est ainsi que Dawson Engler et Frans Kaashoek ont entrepris d'étudier et de développer un nouveau type de noyau informatique exposant la partie matérielle d'un système (non sans sécurités...) afin d’obtenir le but recherché : un système fonctionnant en espace utilisateur ayant une adaptabilité accrue, une meilleure efficacité et une flexibilité d'utilisation des applications pour tendre à plus de performance.
L'exo-noyau ou exokernel a vu le jour à la suite du concept établi par ses pères fondateurs cités précédemment$^,$.
De la simple étude au développement de leurs exo-noyaux, l'équipe du MIT a défini un nouveau standard qui va être suivi et repris par de nombreux autres chercheurs, développeurs et projets afin de s'adapter aux nouveaux besoins et aux technologies récentes$^,$$^,$$^,$$^,$.

### L'exo-noyau face aux autres

Dès le début, le challenge de l'exo-noyau était de prouver que ses qualités lui permettait de tenir tête aux autres systèmes dits monolithiques, aussi performants soient-ils. En effet, d'après des tests effectués en laboratoire (MIT), un des premiers prototypes d'exo-noyau donnait des résultats remarquables : face à Ultrix qui est un système monolithique mature UNIX, l'exo-noyau était 100 fois plus rapide que son concurrent en exécutant la plupart des primitives du noyau. Il a alors été prouvé que de par son architecture, le système monolithique était inapproprié pour plusieurs raisons : l’inefficacité de la gestion des ressources matérielles et l'inflexibilité de modification du code qui amène au découragement. Grâce à son architecture différente et sa façon de multiplexer de manière sécurisée les ressources mises à sa disposition, l'exo-noyau définit une nouvelle vision architecturale : il utilise plusieurs mécanismes qui permettent de s'abroger d'un système d'exploitation$^,$.
De nombreux tests de performances ou benchmark ont été effectués pour prouver le gain de performances$^,$$^,$$^,$$^,$$^,$$^,$$^,$$^,$$^,$.

### Le concept et son évolution
#### 1995

    Le concept de l'exo-noyau était clair : abolir le problème des systèmes monolithiques en terme d'abstractions des ressources physiques et permettre aux développeurs d'être au plus près du matériel. Flexibilité et adaptabilité sont les maîtres mots. Le premier exo-noyau développé par l'équipe du MIT était dédié au processeur x86 en version 32 bits : « Xok » reste le noyau modulaire développé par l'équipe de Dawson Engler et Frans Kaashoek le plus connu et le plus utilisé. La distribution communément employée est « Xok/ExOS »$^,$$^,$$^,$$^,$$^,$$^,$. En parallèle de « Xok », l'équipe du MIT a développé « Aegis » qui est un noyau dédié à l'architecture MIPS$^,$$^,$.

#### 1996

    Le MIT développe « Glaze » : exo-noyau expérimental dédié à l'architecture « FUGU » multiprocesseur.

#### 2000

    « Xok » a été utilisé par une autre équipe américaine pour développer des bibliothèques et des applications en environnement multithreading pour des besoins plus évolués$^,$. « SMP-Xok » a alors vu le jour dans la même période : exo-noyau dédié à l'architecture x86 32 bits multiprocesseur. De par sa simplicité et sa légèreté de code, l'exo-noyau intéresse le domaine universitaire : « Nemesis », noyau d'étude, a vu le jour à l'université de Cambridge. Ce noyau a pour avantage d'être implémenté pour de nombreuses plateformes : x86, RISC 64 bits et StrongARM.

#### 2003

    Un groupe de chercheurs de l'université des sciences et technologies de Lille, se penchent sur le sujet de l'exo-noyau embarqué (encarté) temps réel : « Camille » puis « Camille RT » (version temps réel) est destiné aux systèmes RISC et CISC.

#### 2010

    Un groupe de chercheurs américains a développé l'exo-noyau « XomB » dédié à l'architecture x86 64 bits multiprocesseur.

#### Depuis 2013

    Le projet Xen développe l'exo-noyau « Mirage » (x86) dédié au cloud computing$^,$.

## Architecture du système exo-noyau
### L'exo-noyau

L'exo-noyau est spécifique au type de processeur (se reporter à Inventaire des exo-noyaux pour plus d'informations). Quel que soit le type du système, le noyau protège, multiplexe et partage équitablement les ressources physiques de manière dédiée. Son code est léger et se veut ouvert, modifiable et adaptable$^,$$^,$. Au sein d'un système exo-noyau, la notion importante de la séparation de la protection et de la gestion des ressources s'applique comme suit : le noyau protège les ressources matérielles mais délègue le rôle de la gestion de celles-ci aux bibliothèques et applications$^,$.

#### Chargement de code

Une des propriétés importantes de l'exo-noyau et qui est utilisée par un système monolithique est le chargement de code (downloading code).
Ce mécanisme permet une souplesse d’adaptation et autorise le noyau à être flexible en fonction de son environnement$^,$$^,$. Le noyau peut demander du chargement direct de code pour un contrôle ou lorsqu'il a un doute sur une application : intégrité, sécurité, etc...
Une application de cette technologie : Dynamic Packet Filter (DPF), le filtre dynamique de paquets programmable (pare-feu) implémenté par l'exo-noyau$^,$$^,$$^,$$^,$. « DPF » utilise de la génération dynamique de code et filtre + démultiplexe les paquets reçus avant de les faire parvenir à la couche supérieure. Le mécanisme « ASH » (Application-Specific Safe Handlers) est associé au « DPF » pour la partie notification aux applications. Il utilise également du code chargé lors de l'arrivée d'un flux réseau$^,$.

#### Multiplexage des ressources

Le multiplexage des ressources permet à l'exo-noyau d'être souple et performant. En multiplexant les ressources du processeur, de la mémoire, du stockage et du réseau, plusieurs applications ont accès à celles-ci parallèlement et de manière équitable$^,$. Le détail de ce mécanisme est développé dans Les ressources et leur gestion.

#### Les liens sécurisés (Secure Bindings)

Pour que les bibliothèques du système puissent dialoguer avec la couche matérielle de manière sûre, l'exo-noyau utilise des liens sécurisés (Secure Bindings)$^,$. La mise en place de ce système introduit la notion de sécurité développée dans Sécurité.

### Les LibOSes

L'exo-noyau n'utilise pas de système d'exploitation ou operating system (OS) pour dialoguer avec les applications. Un système d'exploitation unique n'est pas assez souple pour faire fonctionner de manière optimale tous les programmes qui forment la couche de plus haut niveau : il introduit trop de mécanismes et de notions d'abstraction pour atteindre les ressources physiques mises à disposition. Les bibliothèques OS ou « LibOS » (LibOSes au pluriel) éliminent les services d'un OS standard. Une LibOS est l'interface entre un programme et le noyau : elle intègre un code léger modifiable à souhait$^,$. Une LibOS n'a pas de notion de privilège(s) comme l'aurait un OS standard. Cette propriété allège son code de manière considérable. Les sollicitations des ressources matérielles sont effectuées par la LibOS ou directement par les applications et non l'exo-noyau qui ne fait que relayer et enregistrer l'information pour la gestion de la mémoire, CPU, réseau, etc.$^,$ En utilisant autant de LibOSes différentes que d'applications, le développeur peut modifier son application et/ou la LibOS de manière indépendante et n'intervient pas sur le fonctionnement d'une autre application. Cette manière de procéder est un élément de sécurité remarquable$^,$. Chaque LibOS peut utiliser la couche matérielle sans se préoccuper d'une autre bibliothèque pour un accès disque, réseau ou CPU grâce au multiplexage des ressources$^,$.
Il existe des LibOSes spécifiques :
* Pour la gestion du stockage : une « LibFS » (LibFSes au pluriel)$^,$$^,$;
* Pour la gestion du réseau : une LibOS dédiée à la ressource réseau$^,$.
Une LibFS ou une bibliothèque réseau peut être indépendante ou être intégrée à une LibOS. Lorsqu'une de ces bibliothèques est intégrée à une LibOS, celles-ci peuvent être uniques ou multiples au sein de la même LibOS$^,$$^,$. L'exo-noyau fournit aux LibOSes un certain nombre de mécanismes pour garantir son utilisation et celle du matériel au plus bas niveau incluant un niveau d'abstraction minimal. Comme vu, les LibOSes n'intègrent pas de notion de privilège(s) mais sont aussi puissantes qu'un système d'exploitation standard grâce au travail de l'exo-noyau.
Exemples de LibOS :

#### ExOS

    LibOS dédiée à l'exo-kernel « Xok » (architecture x86) et spécialisée dans l’exécution d'applications UNIX non modifiées (POSIX)$^,$.

#### Xok-CThreads

    LibOS dédiée à l'exo-kernel « Xok » et spécialisée dans l'exécution d'applications en environnement multithreading$^,$.

#### libAMP

    LibOS dédiée à l'exo-kernel « Xok » et faisant fonctionner l'interface d'un routeur actif$^,$.

#### VOS

    LibOS dédiée à l'exo-kernel « SMP-Xok » (architecture x86 - multiprocesseurs) pour faire fonctionner des applications en environnement multiprocesseur.

### Les applications

La plupart des applications tournant sur un système exo-noyau ne dialoguent pas avec le noyau mais seulement avec leur LibOS. En général, ces programmes offrent une meilleure performance que sur un système monolithique grâce aux propriétés spécifiques du noyau. Les applications ont le rôle de gestion des ressources matérielles. De ce fait, les programmes ont accès à leurs ressources à un niveau d'abstraction extrêmement bas (voir nul) et l'exo-noyau surveille cette utilisation : les développeurs peuvent donc écrire du code applicatif sans se soucier des abstractions matérielles, ce qui implique que les applications doivent importer ou construire elles-mêmes les abstractions dont elles ont besoin. Pour garder les propriétés des LibOSes au niveau de la légèreté et l'adaptabilité du code, la couche applicative n'intègre pas de notion de privilège(s) car la gestion de la sécurité n'est pas leur rôle.

## Les ressources et leur gestion

Sur un système d'exploitation standard, seules les applications ayant les privilèges ou le noyau ont le droit de gérer les ressources. Au sein d'un système exo-noyau, seules les applications ou les LibOSes gèrent les ressources sans notion de privilège en séparant la gestion de ces dernières de leur protection et de leur multiplexage, qui est laissé à la charge du noyau. En conséquence, dans un système exo-noyau, les applications gèrent leurs propres abstractions de la mémoire virtuelle, la gestion d'un système de fichiers et la gestion du réseau. L'exo-noyau exporte les ressources matérielles au lieu de les émuler, ce qui apporte un gain indéniable en performance et en adaptabilité du code$^,$$^,$. L'exo-noyau utilise trois techniques pour exporter les ressources :
* En utilisant des liens sécurisés gérés par le noyau (Secure Bindings) entre le matériel et les LibOSes;
* En acquittant l'utilisation des ressources de manière ouverte et visible : ainsi, toute application est au courant de l'action et peut profiter de la ressource de manière optimisée;
* En donnant la possibilité au noyau de briser tout lien sécurisé vers une ressource lorsqu'une application devient un point individuel de défaillance ou SPOF (Single point of failure).
Le partage des ressources, géré au niveau LibOS et applicatif, fonctionne grâce à la communication inter-processus (IPC ou Inter Process Call ). Ce mécanisme basé sur l'utilisation de pointeurs sur les ressources, permet de vérifier si celles-ci sont disponibles. Un processus de sécurité gère les demandes et utilisations frauduleuses de la couche matérielle.

### Le processeur

L'exo-noyau informe les applications des événements processeur : les interruptions, les exceptions, le début et la fin d'un quantum de temps$^,$. La ressource CPU utilise une pile à accès multiples, de telle manière qu'un programme peut accéder à la liste circulaire en parallèle d'un autre$^,$$^,$. Cette pile des processus est ouverte et accessible en lecture / écriture par toute LibOS. Grâce à cela, tout programme a la vision de la file en cours et peut utiliser la ressource CPU de manière équitable. Un mécanisme permet également à un programme de donner de la ressource processeur à un autre. L'acquittement de la ressource CPU est explicite. Les processus ont donc l’opportunité de modifier leur contexte à la fin d'un quantum de temps. La particularité de la ressource CPU par rapport à un système classique est la gestion des processus : ceux-ci sont informés de leur niveau d'accès au processeur et peuvent donc réagir en conséquence; demander plus de ressource CPU ou non. De même, lorsqu'un processus prend trop de temps d’exécution, celui-ci se voit pénalisé par un plus faible niveau d'accès. Dans le cas extrême, il est tué.
Au sein du processeur, l'ordonnanceur ne tient pas compte des exceptions sur les périphériques d'entrée / sortie. Seule exception à la règle : la demande explicite d'une application.
En environnement temps réel, pour chaque quantum de temps CPU, le noyau utilise une politique de round-robin pour élire une application. En environnement temps réel et multiprocesseur, la communication inter-processus est essentielle à la performance des composants du système tel que les systèmes de fichiers et la gestion des processus. De ce fait, l'IPC (Inter-process communication) doit avoir le niveau de priorité le plus élevé du point de vue programmation, ce qui permet d’alléger les tâches de l'exo-noyau. Enfin, l'exo-noyau est responsable de la cohérence des TLB ou Translation Lookaside Buffers des processeurs entre eux lorsqu'ils sont plusieurs.

### La mémoire

La mémoire physique est la ressource la plus simple à multiplexer. Quand une LibOS demande l'allocation d'une page mémoire physique, l'exo-noyau crée un lien sécurisé vers une page en enregistrant l'identifiant du client et les droits de lecture / écriture dans le cache de la mémoire vive puis alloue l'espace physique à l'application. Les priorités de ces liens sécurisés sont l'auto-authentification et la translation d'adresse. En parallèle, le noyau gère un large espace TLB (Translation Lookaside Buffer) logiciel pour permettre cette translation d'adresse. Le client de l'espace mémoire a la possibilité de modifier ses droits et de libérer la ressource$^,$. Les LibOSes ont un accès réservé à leur mémoire grâce à l'exo-noyau qui garantit la ressource. Dès que le noyau décèle une anomalie, il fait remonter l'information à la LibOS affectée.
Une LibOS fournit un système rudimentaire de mémoire virtuelle : il fournit un support flexible pour l'aliasing, le partage, l'allocation et la libération de la ressource mémoire ainsi que l'accès direct à la mémoire$^,$. L'accès direct de cette mémoire virtuelle à la mémoire physique se fait sous contrôle du MMU (unité de gestion mémoire). Chaque processus tournant sur un système exo-noyau gère son propre identifiant en mémoire virtuelle qui pointe vers une ressource mémoire physique.
L'exo-noyau possède trois mécanismes pour multiplexer la mémoire principale :
* Chaque processus possède sa propre table en mémoire virtuelle qui contient ses droits et sa plage d'accès à la mémoire physique;
* Les droits d'accès à la ressource mémoire sont donnés quand un processus veut allouer un espace physique libre;
* Les droits d'accès à la ressource mémoire sont donnés à un processus lorsqu'un autre processus lui donne ses droits ou une partie.

### Le stockage

Les applications et les LibOSes ont un accès direct au disque dur et au niveau des blocs de celui-ci. Elles gèrent entièrement l'accès à la ressource stockage sous le contrôle de l'exo-noyau pour la sécurité et la gestion des conflits. En termes de pilote disque intégré à une LibOS, le MIT a tout d'abord repris l'existant de la distribution FreeBSD et l'a adapté à l'exo-noyau : le support UltraDMA IDE de cet OS reprend la philosophie et les attentes de l'exo-noyau en termes d'accès direct à la ressource. Pour garantir le multiplexage de la ressource disque en toute sécurité et permettre aux applications d'utiliser plusieurs systèmes de fichiers, le modèle exo-noyau possède des LibOSes dédiées : les LibFSes (LibFS au singulier). Chaque LibFS traduit un système de fichiers. Les LibFSes peuvent être multiples au sein d'une LibOS ou d'un système modulaire exo-noyau. Le rôle de l'exo-noyau est de donner le maximum de contrôle à la LibFS pour la gestion du système de fichiers tout en protégeant l'accès aux données. Pour fournir la protection nécessaire, le noyau doit faire en sorte que chaque LibFS n'accède qu'aux blocs qui lui sont alloués. Pour être flexible et rapide, l'exo-noyau applique sa protection au niveau du bloc de disque plutôt que de la partition. Pour permettre aux LibFSes d’exécuter leur propre gestion de système de fichiers et fournir la stabilité nécessaire, quatre points sont à satisfaire :
* L'utilisation des systèmes de fichiers doit être simple et légère. Aucune notion de privilège n'est autorisée pour ne pas alourdir le code et interférer avec le rôle du noyau au niveau de la sécurité;
* Plusieurs LibFSes doivent pouvoir partager en toute sécurité les données au niveau des blocs du disque et des métadonnées;
* Le(s) disque(s) utilisé(s) doit être aussi performant que l'exige le système de fichiers;
* Le système de stockage doit faciliter le partage de sa mémoire cache entre les LibFSes et le traitement simple des problèmes de cohérence et de sécurité.
Le système de fichier natif utilisé par le noyau « Xok » est « XN » qui est défini pour un accès en mode bloc$^,$$^,$.
Un exemple de LibFS pour les applications UNIX : « C-FFS » permet l'accès aux systèmes de fichiers du monde POSIX et étend les fonctionnalités de « XN » en matière de rapidité grâce à l'utilisation de chargement de code dans le noyau$^,$.

### Le réseau

La couche applicative du modèle exo-noyau a un accès direct à l'interface réseau : elle a la gestion de la ressource réseau sans interaction avec une autre couche ce qui induit une meilleure performance. Le noyau intervient seulement au niveau de la sécurité et dispose d'une pile FIFO (First in, first out) pour la redirection des paquets en entrée / sortie. Lors de la réception de paquets, l'exo-noyau copie ceux-ci dans un espace mémoire dédié pour que l'application puisse les récupérer à l'adresse indiquée : c'est ainsi que le noyau démultiplexe les données entrantes$^,$. Lors de la récupération des données en provenance du réseau et avant la mise à disposition aux LibOSes, le noyau utilise un filtre dynamique de paquets « DPF » (Dynamique Packet Filter - pare-feu) programmable pour sécuriser son système$^,$$^,$$^,$$^,$$^,$. Celui-ci participe donc activement au processus de démultiplexage des paquets entrants. Associée au « DPF », l'utilisation du « ASH » (Application-specific Safe Handlers) participe à la sécurité du système à l'arrivée d'un flux réseau : ce mécanisme notifie les LibOSes et/ou les applications par message(s) lors d'un problème détecté par le pare-feu « DPF »$^,$. Pour une gestion plus efficace de la ressource réseau, le système exo-noyau peut utiliser une (ou des) « LibOS(es) » dédiée(s) au(x) réseau(x). Celle-ci peut être intégrée à la « LibOS » ou non$^,$.
Conformément à la philosophie de l'exo-noyau en termes d'exposition des ressources et de l'information, la solution « Xok/ExOS » implémente un accès direct au cache ARP (table ARP) du système pour les applications sous le contrôle d'un pare-feu « DPF ».
En 2002, une équipe du MIT s'est intéressée à un pilote réseau utilisé par le framework « OSKit ». Celui-ci permet l'utilisation d'un certain nombre de cartes réseaux comme les modèles de 3Com ou Intel et a donc été repris et adapté pour les besoins de l'exo-noyau « Xok ». À la même période, cette équipe a également étudié le problème des multiples protocoles réseaux existants et la manière d'en implémenter. Grâce à leur langage de programmation « Prolac » inventé spécialement à cet effet, le MIT a développé son propre prototype du protocole TCP (Transmission Control Protocol) reprenant la philosophie de l'exo-noyau en termes d'architecture modulaire. En parallèle de son projet de serveur World Wide Web « Cheetah », le MIT a développé une application orientée réseau : un TCP Forwarder pour la distribution « Xok/ExOS » qui permet de faire du TCP Tunneling.
Grâce à son étude sur les mécanismes réseaux implémentés au sein du modèle exo-noyau, le MIT espère faire avancer la recherche en termes de multiplexage des cartes réseaux sur un système informatique.

## Les utilisations de l'exo-noyau
### Exo-noyau pour système embarqué

Dans le domaine des cartes à puce, l'étude de l'utilisation de l'exo-noyau embarqué (encarté) a été menée par une équipe de chercheurs de l'université des sciences et technologies de Lille$^,$. Le but de cette étude était de concevoir un système modulaire adapté à une carte à puce en reprenant le concept du MIT en termes d'absence d'abstraction matérielle et en apportant un accès sécurisé et (dé)multiplexé aux ressources physiques. La première étude fut menée sur l'exo-noyau « Camille ». Le but est de supporter les différentes ressources matérielles utilisées dans les cartes. Les caractéristiques de cet exo-noyau : la portabilité, la sécurité et l'extensibilité.
La seconde étude portait sur l'exo-noyau « Camille RT » qui reprend le principe du premier mais qui introduit la notion du temps réel. « Camille RT » est conçu pour faire cohabiter les applications standards avec les applications temps réel. L'architecture première de l'exo-noyau du MIT n'apporte pas de primitives temps réel et « Camille RT » pallie ce problème avec l'utilisation d'un ordonnanceur temps réel conçu pour cette architecture modulaire. Afin d'arriver au résultat attendu, l'étude du temps d’exécution de chaque primitive de l'exo-noyau et l'analyse du noyau temps réel RTEMS ont été nécessaires. Le but de cette étude était également de se pencher sur le calcul du temps d’exécution au pire cas (WCET) et de faire avancer les recherches dans ce domaine.

### Exo-noyau pour serveur

Les implémentations de l'exo-noyau en environnement serveur sont multiples. En partant du simple noyau x86 32 bits comme « Xok »$^,$$^,$$^,$$^,$$^,$ pour arriver à « XomB » dédié à l'architecture x86 64 bits multiprocesseur, chacun d'entre eux est capable de faire fonctionner des applications non modifiées grâce à une LibOS dédiée$^,$.
L'exo-noyau le plus étudié et le plus utilisé en environnement serveur reste « Xok » développé par le MIT (Massachusetts Institute of Technology). La LibOS ExOS$^,$ dédiée à « Xok » et faisant fonctionner des programmes UNIX non modifiés a mené à la distribution « EXOPC » (« Xok/ExOS »). Cette solution utilise communément UDP/IP, TCP/IP et les sockets POSIX et est la plateforme standard pour faire fonctionner des applications serveurs de type HTTP en parallèle d'autres applications. De nombreux tests d'applications standards UNIX ont alors été effectués en environnement modulaire exo-noyau. À la vue des propriétés de ce système en matière de rapidité, d'accès aux ressources et d'adaptabilité, le MIT a développé un serveur web rapide et léger : « Cheetah »$^,$$^,$. L'avantage indéniable concernant « Xok/ExOS » faisant fonctionner « Cheetah » est la rapidité de chargement et d’exécution. Des tests prouvent que cette plateforme est plus rapide que ses concurrents lors de benchmarks : temps de chargement (en secondes) en fonction de la taille de la page HTTP. En parallèle du développement de leur serveur World Wide Web, le MIT s'est penché sur l'implémentation d'une bibliothèque d'entrées / sorties extensible qu'utilise « Cheetah » : « XIO ». Cette bibliothèque doit simplifier le développement de serveurs HTTP à hautes performances.

### Exo-noyau pour routeur actif

L'équipement réseau utilise l'exo-noyau dans le monde des routeurs actifs. C'est en 2001 que le projet 'AMP' utilise l'exo-noyau du MIT « Xok »$^,$$^,$$^,$$^,$$^,$ puis la distribution 'EXOPC' « Xok/ExOS »$^,$ pour faire fonctionner leur interface pour routeur actif : « NodeOS ». En utilisant le framework « OSKit » pour la création de leur applicatif, l'équipe du projet a développé une LibOS destinée à l'exo-noyau du MIT : « libAMP ». Profitant de l'architecture propice à l'utilisation du matériel à bas niveau, du multiplexage des ressources, de l'adaptabilité du code et des mécanismes de protections, « Xok/libAMP » apparait comme une solution performante, sûre et efficace$^,$$^,$. Le routeur actif utilisant ce système profite d'une gestion des paquets réseaux à très bas niveau grâce à l'absence d'abstraction matérielle qu'offre l'exo-noyau. L'utilisation du framework « THINK » et ses fonctionnalités ont complété la solution « OSKit » en 2002 pour le développement du système supportant l'interface « NodeOS ».

### Exo-noyau pour le cloud computing

Le projet Xen a débuté en 2013 le développement d'un exo-noyau orienté vers le cloud computing. Mirage est un exo-noyau basé sur l'architecture x86 et est destiné à faire fonctionner des applications orientées réseau qui sont sécurisées et de haute performance dans le cloud. La distribution appelée « Mirage OS » est basée sur l'étude de l'exo-noyau « Nemesis » et utilise les hyperviseurs Xen avec la philosophie et les principes de l'exo-noyau : la création d'applications rapides, flexibles et adaptables en étant au plus près du matériel sans avoir à gérer les milliers de pilotes de périphériques que l'on trouve dans un système d'exploitation standard. Une des utilisations les plus connues de « Mirage OS » est la solution « Amazon EC2 »$^,$.

## Performance

Dès le début de l’histoire de l’exo-noyau avec la conception de leur premier prototype, le MIT (Massachusetts Institute of Technology) a prouvé que l’architecture de son modèle modulaire était bien plus rapide que n’importe quel système monolithique . Les premiers tests ont révélé des résultats remarquables : l’exécution de la plupart des primitives de leur noyau était 100 fois plus rapide comparé à Ultrix qui est un système monolithique UNIX mature$^,$. L’exemple de « Aegis », une des premières études exo-noyau basé sur l’architecture MIPS a montré qu’une simple commande UNIX « getpid » coutait beaucoup plus de temps à un système monolithique de par ses abstractions matérielles. Grâce à différentes études et tests, la preuve était faite que l’exo-noyau était plus performant, plus flexible et offrait plus de possibilités en rapport avec son architecture. En exposant ses données et en laissant la couche applicative gérer les ressources matérielles pour un maximum de contrôle, l’exo-noyau peut se concentrer sur la protection de son système : ce mécanisme est un des points favorisant la performance globale$^,$. L’exo-noyau est un système flexible et adaptable et ne pâtit pas de ces fonctionnalités pour être rapide. Les applications légères et dynamiques tel que le serveur HTTP « Cheetah » du MIT donnent les résultats les plus significatifs. Le chargement de code au sein de l'exo-noyau est orienté performance sur deux points$^,$ :
* Cela permet aux applications de ne pas constamment faire appel au noyau qui exécute du code chargé lors d'actions spécifiques;
* Cela permet au noyau de faire abstraction des programmes en exécutant du code chargé sans attendre une demande applicative.
Le pare-feu qu'utilise l'exo-noyau emploie un système de notifications pour les applications : le ASH (Application-Specific Safe Handlers). Ce mécanisme permet au système d'être plus performant grâce à une couche applicative informée des événements réseaux.
L'exo-noyau du MIT « Xok »$^,$$^,$$^,$$^,$$^,$ et plus particulièrement la distribution « EXOPC » (« Xok/ExOS ») ont fait l’œuvre de nombreux tests et comparatifs :

### Performance globale de « Xok/ExOS » face à FreeBSD

    Face à FreeBSD, système monolithique connu pour une très bonne performance globale, « Xok/ExOS » arrive en tête. Quel que soit le nombre de processus fonctionnant et/ou lancés simultanément, la solution exo-noyau offre le meilleur résultat global$^,$.

### « Xok » et la performance des applications UNIX non modifiées grâce à la LibOS « ExOS »

    Face à ses concurrents open source les plus rapides qui sont OpenBSD et FreeBSD, « Xok/ExOS » arrive en tête lors de l’exécution de nombreux programmes UNIX non modifiés. OpenBSD n'utilisant pas la LibFS « C-FFS » est même moins rapide qu'en l'utilisant$^,$$^,$$^,$$^,$.

### La performance de « Cheetah » fonctionnant avec le noyau « Xok »

    « Cheetah » est le serveur HTTP rapide et léger du MIT. Ce serveur passe directement par le noyau sans opération du processeur grâce à un mécanisme de stockage des données en mémoire cache. Les résultats de « Cheetah/Xok » en nombre de requêtes par seconde en fonction de la taille d'une page HTTP sont remarquables par rapport à ses concurrents les plus rapides$^,$. Plusieurs solutions sont mises en œuvre pour démontrer cette performance :
* Cheetah/Xok = Serveur HTTP « Cheetah » + exo-noyau « Xok » + bibliothèque entrée/sortie « XIO » optimisée + TCP optimisé.
* Socket/Xok = Serveur HTTP « Cheetah » + exo-noyau « Xok ».
* Socket/BSD = Serveur HTTP « Cheetah » + OpenBSD 2.0.
* Harvest/BSD = Proxy-cache « Harvest » + OpenBSD 2.0.
* NSCA/BSD = Serveur HTTP « NSCA 1.4.2 » + OpenBSD 2.0.

### « XCP » est un programme de copie de données orienté exo-noyau

    « XCP » travaille au niveau des blocs du disque dur en évitant d'affecter le processeur sur les données qu'il traite. Son mode de fonctionnement est asynchrone et il ne passe par aucun fichier temporaire. Grâce à « Xok/ExOS », il est trois fois plus rapide que la commande « CP » pour la copie du même fichier. Ce résultat démontre la performance des applications qui passent outre un système d'exploitation standard et qui accèdent directement aux ressources$^,$.
En parallèle du développement de leur serveur web « Cheetah », le MIT a développé « Webswamp », un programme fonctionnant avec la distribution « Xok/ExOS » et qui permet de faire du benchmark d'applications HTTP. Grâce à cet outil performant, les chercheurs du Massachusetts Institute of Technology peuvent analyser le positionnement de leurs systèmes face aux concurrents et donc les améliorer le cas échéant.

## Sécurité

Un système d'exploitation standard implémente des processus, des adresses en mémoire et des exceptions pour assurer sa sécurité : ce mécanisme induit l'action des applications dans la sécurité du système. Les processus lancés sur un système monolithique ont souvent trop de privilèges qui ne sont pas gérés par celui-ci ce qui rend l'ensemble vulnérable. L'exo-noyau va à l'encontre de cette approche : il est le seul à gérer la protection de son environnement. La méthode employée est la suivante : la séparation de la gestion des ressources donnée aux applications et de la sécurité gérée par le noyau$^,$$^,$$^,$. Le principal inconvénient de l'architecture exo-noyau est sa vulnérabilité face aux attaques contre la sécurité du système. En effet, en fournissant un accès direct aux ressources matérielles et aux applications on favorise les accès illégaux aux données$^,$$^,$. Une application ne doit pas avoir accès à des données sans permission(s). De même, tout applicatif ne doit pas accaparer toutes les ressources du système au risque de compromettre la qualité de service. Le grand avantage de l'exo-noyau au niveau de la politique de sécurité, c'est que celle-ci n'empiète pas sur la gestion des ressources ce qui est souvent le cas d'un système monolithique. Le programmeur peut donc implémenter son code sans se soucier de cet aspect. La philosophie du MIT sur ce sujet est la suivante : l'exo-noyau apporte des mécanismes de protection, pas des politiques de sécurité$^,$.
Ces mécanismes de protection ont un nom : les liens sécurisés (Secure Bindings)$^,$$^,$. Ces liaisons s'effectuent entre les LibOSes et la couche matérielle et passent par le noyau qui applique ainsi sa sécurité. La performance du système n'est pas remise en question car les opérations logicielles effectuées par l'exo-noyau lors de ces étapes sont simples et rapides. Les trois techniques de base utilisées pour l'implémentation d'un lien sécurisé sont : les mécanismes matériels, les opérations en mémoire cache et le chargement de code$^,$.
Présentation des mécanismes :

### Les mécanismes matériels

    Les liens sécurisés implémentant cette solution sont utilisés pour la protection de l'accès à la ressource disque. Les droits d'accès d'une LibOS (ou LibFS) aux blocs d'un disque dur sont du code généré dynamiquement et stocké par le noyau dans le cache du disque$^,$.

### Les opérations en mémoire cache

    Cette solution est utilisée pour la protection des accès mémoire qui est basée sur la génération dynamique d'un code de vérification$^,$. Ce code est stocké dans le cache de la mémoire vive (RAM) et définit les droits de la LibOS affectée. Si ces droits sont insuffisants, l'accès est refusé. L'exo-noyau utilise un large TLB ou Translation lookaside buffer logiciel (différent du TLB matériel du processeur) pour la translation d'adresses : cet espace est un cache que le noyau utilise également pour établir ces liens sécurisés entre les LibOSes et la partie matérielle.

### Le chargement de code

    Cette méthode entre en fonction pour la protection du système contre le flux réseau entrant. Le filtre dynamique de paquets ou DPF (Dynamique Packet Filter - pare-feu) utilisé par l'exo-noyau emploie du chargement de code lors de l'analyse des paquets réseau entrants avant la mise à disposition aux LibOSes$^,$$^,$$^,$$^,$$^,$. Le « ASH » (Application-specific Safe Handlers) est utilisé par le « DPF » pour le dialogue avec la couche LibOS/applicative$^,$.
Si une application pose un problème lors de l'utilisation d'une ressource matérielle, l'exo-noyau est capable de lui interdire l'accès en brisant le lien sécurisé.

## Création d'exo-noyau

Grâce à la plateforme de développement (ou framework) « THINK » qui reprend les notions importantes en termes de ressources (logicielles et matérielles) de l'exo-noyau, il est possible de concevoir un tel noyau. En reprenant le principe des liaisons sécurisées entre les LibOSes et le matériel en passant par l'exo-noyau, cet outil de mise en œuvre est idéal$^,$. « THINK » est orienté concept exo-noyau à 100% donc application modulaire. Les pleins pouvoirs sur l'utilisation des ressources matérielles mises à disposition, les exigences en matière de flexibilité et de performances chères au concept, la notion de sécurité aux besoins du développeur : tous ces points cruciaux et faisant la force de l'architecture de l'exo-noyau sont ici réunis. Un des projets utilisant cette solution de développement est « AMP » dans l'implémentation d'un système exo-noyau pour la gestion de l'interface d'un routeur actif.
Un autre projet reprend la même approche que « THINK » : le framework « OSKit ». Cette plateforme de développement permet de créer un exo-noyau grâce à une collection de bibliothèques et d'outils. Le projet « AMP » a également utilisé « OSKit » pour la création de son système exo-noyau gérant l'interface d'un routeur actif.

## Inventaire des exo-noyaux

Référencement des exo-noyaux :
| Nom | Architecture | Multiprocesseur | Utilisation | Auteur(s) | Année |
| Aegis$^,$$^,$ | MIPS | Non | Serveur | D. Engler et F. Kaashoek | 1995 |
| Camille | RISC / CISC | Non | Embarqué | D. Deville, A. Courbot et G. Grimaud | 2003 |
| Camille RT | RISC / CISC | Non | Embarqué - Temps réel | D. Deville et A. Courbot | 2003 |
| Glaze | FUGU | Oui | Serveur | K. Mackenzie, J. Kubiatowicz, M. Frank, W. Lee, V. Lee, A. Agarwal, et F. Kaashoek | 1996 |
| Nemesis$^,$ | x86, DEC ALPHA (RISC_64), StrongARM | Non | Serveur | University of Cambridge | 2000 |
| Mirage$^,$$^,$ | x86 | Oui | Cloud computing | Projet Xen | 2013 |
| Xok$^,$$^,$$^,$$^,$$^,$ | x86_32 | Non | Serveur, Routeur Actif | D. Engler et F. Kaashoek | 1995 |
| SMP-Xok | x86_32 | Oui | Serveur | B. Chen | 2000 |
| XomB$^,$ | x86_64 | Oui | Serveur | J. Larkby-Lahet, B. Madden, D. Wilkinson et D. Mosse | 2010 |