Micro-noyaux

Quand j'ai commencé à écrire le noyau de Linux une théorie arrêtée définissait la manière d'écrire un système portable. Tout le monde préconisait d'utiliser une architecture fondée sur les micro-noyaux.

Dans les noyaux monolithiques, par exemple celui de Linux, la mémoire est divisée entre l'espace utilisateur et l'espace noyau. L'espace noyau est l'endroit où le code réel du noyau réside après son chargement, et où la mémoire est allouée pour les opérations qui prennent place à son niveau. Ces opérations incluent l'ordonnancement, la gestion des processus et des signaux, des entrées/sorties assurées par les périphériques, de la mémoire et de la pagination. Ce sont autant d'opérations de base requises par les autres programmes. Le code du noyau assure les interactions de bas niveau avec le matériel, les noyaux monolithiques semblent spécifiques à une architecture donnée.

Un micro-noyau effectue un nombre bien plus restreint d'opérations, et sous une forme plus limitée : la communication entre processus, une gestion limitée des processus et de l'ordonnancement ainsi qu'une partie des entrées/sorties de bas niveau. Ainsi, les micro-noyaux se révèlent être moins spécifiques au matériel car un grand nombre des particularités du système sont placées dans l'espace utilisateur. Une architecture à micro-noyau est en quelque sorte une manière de s'éloigner des détails du contrôle des processus, de l'allocation mémoire et de celle des ressources, afin que le port vers un autre matériel ne requière que des changements minimes.

Ainsi, au moment où j'ai commencé à travailler sur Linux, en 1991, on supposait que la portabilité devait découler d'une approche de type micro-noyau. Elle constituait alors la marotte des chercheurs en informatique théorique. Cependant, je suis pragmatique et pensais alors que les micro-noyaux

  1. étaient expérimentaux,

  2. étaient manifestement plus complexes que les noyaux monolithiques

  3. avaient une vitesse d'exécution bien inférieure à celle des noyaux monolitiques.

La rapidité importe beaucoup dans la réalité, c'est pourquoi on dépensait beaucoup d'argent dans le domaine de la recherche sur les optimisations pour micro-noyaux afin qu'ils puissent fonctionner aussi rapidement que leurs pendants plus classiques. Une des choses amusantes à la lecture de ces articles est qu'on s'apercevait que bien que les chercheurs appliquent leurs astuces d'optimisation sur des micro-noyaux, on pouvait aussi facilement utiliser ces dernières sur des noyaux traditionnels pour les accélérer.

En fait, cela m'a amené à estimer que l'approche fondée sur des micro-noyaux était fondamentalement malhonnête car destinée à obtenir davantage de subsides pour la recherche. Je ne pense pas nécessairement que ces chercheurs étaient consciemment malhonnêtes. Peut-être étaient-ils tout simplement stupides, ou induits en erreur. Je le dis dans son sens premier : la malhonnêteté vient de la forte pression qui s'exerçait à ce moment précis à l'intérieur de la communauté scientifique pour favoriser l'étude des micro-noyaux. Dans un laboratoire d'informatique, vous étudiiez les micro-noyaux ou bien vous n'étudiiez pas du tout les noyaux. Ainsi, tout le monde, y compris les concepteurs de MS-Windows NT, était embarqué dans cette approche malhonnête. Alors même que cette équipe savait que le résultat final ne ressemblerait en rien à un micro-noyau, elle était consciente qu'elle devait lui rendre des hommages peu sincères.

Heureusement, je n'ai jamais subi de réelle pression pour aller vers les micro-noyaux. Les chercheurs de l'université d'Helsinki étudiaient les systèmes d'exploitation depuis la fin des années 1960 et ne trouvaient plus grand intérêt dans la recherche sur les noyaux. Dans un sens, ils avaient raison : les bases des systèmes d'exploitation, et par extension du noyau Linux, étaient bien comprises au début des années 1970 ; tout ce qui a été fait ensuite n'a été, d'une certaine manière, qu'un exercice d'auto-satisfaction.

Si vous voulez rendre un code portable, vous n'avez pas nécessairement besoin de créer un niveau d'abstraction pour assurer la portabilité. Vous pouvez aussi programmer intelligemment. Essayer de rendre les micro-noyaux portables est par essence une perte de temps, cela revient à construire une voiture exceptionnellement rapide équipée de pneus carrés. L'idée de s'abstraire de la partie qui doit être ultra rapide — le noyau —  est de façon inhérente contre-productive.

Bien entendu, dans la recherche sur les micro-noyaux, il y a plus que cela. Mais la partie cruciale du problème est la différence d'objectifs. Le but de la majeure partie de la recherche sur les micro-noyaux était de concevoir un idéal théorique, de définir un mode de conception aussi portable que possible sur toutes les architectures imaginables. Je ne caressais pas, avec Linux, d'objectif aussi noble. J'étais intéressé par la portabilité entre des systèmes réels et non théoriques.