Mach : une autre vision du noyau

Il est possible de classer les systèmes d'exploitation selon plusieurs critères. L'un d'entre eux est le type de noyau qu'ils utilisent. Dans cette catégorie, on distingue deux grandes familles, la première regroupe les noyaux monolithiques, c'est le cas de Linux où toutes les fonctionnalités (gestion du matériel, des processus, gestion du réseau et des systèmes de fichiers) sont regroupées dans un seul gros morceau de code. Ceci est la vision traditionnelle des sytèmes de type Unix. Mais il existe une alternative ...

L'autre grande famille de systèmes se base sur un noyau bien plus petit. Dans ce cas, le micro-noyau est conçu de manière complètement différente. En effet, tout ce qui sort du cadre strict de la gestion de matériel, de processus, de mémoire et de la communication inter-processus ne fait plus partie du micro-noyau. Le gros avantage qui en découle est naturellement une modularité extrême. Il est alors possible d'implémenter toutes les autres fonctionnalités en dehors du kernel, ce qui a pour effet de les placer dans le mode utilisateur.

Mach

Le micro-noyau Mach (prononcer "mârr") a été conçu dans une optique de portabilité et de support multi-processeurs. Aujourd'hui, ces arguments ne sont plus d'actualité. Linus Torvalds a, en effet, démontré qu'il était parfaitement possible de gérer de manière performante une architecture multi-processeurs avec un noyau monolithique, tout en permettant une portabilité exemplaire. Fort heureusement, les motivations originelles des concepteurs de Mach apportent bien d'autres avantages, mais avant tout, voyons son histoire ...

Les racines de Mach proviennent d'un système développé par l'université de Carnegie Mellon (CMU) sous le nom de Accent. Ce dernier était très en avance au niveau conceptuel mais interdisait malheureusement toute compatibilité avec les Unix classiques de l'époque. Mach a donc été développé en reprenant des principes déjà présents dans Accent, mais avec deux nouveaux objectifs que nous avons cités plus haut : portabilité et gestion SMP. Mach est donc historiquement une fusion entre Accent et le noyau BSD 4.2. Au fil du développement de Mach, les composants de BSD étaient réimplémentés et remplacés par ceux de Mach. A la fin des années 80, Mach reprenait déjà une grande partie du code du noyau BSD, mais ce n'est qu'avec Mach 3 que ce code fut déplacé à l'extérieur du noyau. Tout le code Unix fut déplacé dans le mode utilisateur sous la forme de serveurs. Il était ainsi possible d'utiliser Mach 3 et des serveurs implémentant des systèmes comme Dos, MacOS, OS/2 ou encore HP-UX. Plus intéressant encore, il était possible de faire fonctionner de concert plusieurs serveurs et donc virtuellement plusieurs systèmes en même temps sur la même machine. Il ne s'agit pas là de théorie mais bel et bien de fait; vous trouverez sur http://www.cs.cmu.edu/afs/cs/project/mach/public/www/doc/publications.html toutes les documentations utiles répertoriant ces expérimentations.

1989 fut l'année de la révélation pour Mach. L'Open Software Fondation (OSF) annonça l'utilisation de Mach comme base pour la création d'un nouveau système appelé OSF/1 (qui sortit en 90). Depuis, les concepts de Mach sont toujours d'actualité. En effet, Mach est également la base du système utilisé sur les stations NeXT, qui sont elles-mêmes l'une des sources d'inspiration de MacOS X. Il n'est donc pas étonnant de voir que Mach 3 et FreeBSD 3.2 forment la base de MacOS X (http://www.apple.com/macosx/server/features/architecture.html). Mach (GnuMach) est également le micro-noyau utilisé pour le système d'exploitation GNU/Hurd.

Principes

L'approche utilisée avec Mach est relativement différente de ce que l'on rencontre avec un Unix classique. Ainsi, par exemple, la notion de processus n'existe pas ou, du moins, pas dans le sens traditionnel. Les fonctionnalités offertes sont réduites au minimum. Mach ne fait pas grand chose mais il le fait très bien. Voyons comment est organisé ce système :

  • Une tâche est l'unité de ressource de base. Une tâche est composée d'au minimum un thread, de ports et d'un espace d'adresse protégé.
  • Les threads font toujours partie d'une tâche, il s'agit de l'unité d'exécution de base. Les threads d'une tâche partagent les ressources de cette dernière : les ports et l'espace mémoire. Nous l'avons dit plus haut, les processus n'existent pas avec Mach mais il paraît raisonnable d'associer ce concept à une tâche ne possédant qu'un seul thread.
  • Les ports sont les canaux de communication des tâches. Ceux-ci sont protégés par le noyau et permettent le passage de messages d'une tâche à l'autre.
  • Les droits sur les ports ou port right représentent la seule manière d'accéder à un port. Il existe trois types de droit : le droit d'émission permet au tenant de ce droit d'envoyer des messages au port en question, le droit de réception, qui permet de recevoir des messages en provenance du port associé et enfin, le droit d'émission unique qui permet d'envoyer un seul message (le droit est détruit après l'émission du message).
  • Les ports sets permettent de grouper les ports en une entité unique.
  • Les messages sont des données typées circulant entre deux entités. Un message est composé de plusieurs éléments dont son origine, sa destination et bien entendu le contenu du message. Pour faire le rapprochement avec ce que l'on peut trouver dans un Unix traditionnel, un message peut être considéré comme un signal évolué.

    Nous ne pourrons pas exposer ici toutes les caractéristiques du micro-noyau Mach. Vous trouverez dans les liens en fin d'article des références à plusieurs documentations importantes qu'il convient d'étudier pour bien comprendre les nouveautés apportées par un tel concept.

    Et le Hurd ?

    Le GNU Hurd utilise un micro-noyau de type Mach. Il s'agit de GnuMach qui se place, en termes de fonctionnalités, entre Mach 3 et Mach 4. Il ne s'agit pas là de la première utilisation globale d'un micro-noyau Mach. En effet, les utilisateurs de MkLinux emploient déjà un Mach mais le concept reste très différent.

    MkLinux utilise un micro-noyau Mach au-dessus duquel fonctionne un seul serveur qui est dérivé des sources du noyau Linux. C'est là ce qu'on appelle une architecture micro-noyau mono-serveur. Par opposition, GnuHurd utilise une architecture multi-serveurs.

    Arrêtons là cette courte introduction. Nous avons présenté quelques-uns des principes de base de Mach et du Hurd et le mois prochain, nous commencerons une exploration plus poussée de ces concepts.

    Liens

    La page officielle du Hurd
    http://www.gnu.org/software/hurd/

    Mach homepage
    http://www.cs.cmu.edu/afs/cs.cmu.edu/project/mach/public/www/mach.html

    Chapitre Mach du livre "Operating System Concepts"
    http://www.bell-labs.com/topic/books/os-book/mach-dir/

    Les documentations OSF Mach
    http://www.hurd-fr.org/ps/

    Une collection de documentations sur Mach
    ftp://ftp.cs.cmu.edu/project/mach/doc/published/

    Oskit/Mach
    http://www.cs.utah.edu/flux/

    Site de documentation du Hurd
    http://hurddocs.sourceforge.net

    Linux Magazine France n°27 - Avril 2001