# Les systèmes d'exploitation/Le noyau d'un système d'exploitation

Au tout début de l'informatique, le logiciel assurait lui-même la gestion du matériel. Chaque application gérait elle-même la mémoire, la communication avec les périphériques et bien d'autres choses. Le logiciel pouvait être démarré directement à l'allumage de l'ordinateur, sans charger de système d'exploitation. En conséquence, les logiciels n'étaient pas compatibles sur une large gamme de matériel et supportaient assez mal un changement de configuration.
Mais avec le temps, les informaticiens ont inventé des techniques d'abstraction matérielle qui permettent à un programme de s'exécuter sur des ordinateurs avec des matériels très différents. Rendre les programmes indépendants du matériel a demandé de revoir l'organisation des logiciels, qui ont dû être découpés en plusieurs programmes séparés :
* les programmes systèmes gèrent la mémoire et les périphériques ;
* les programmes applicatifs ou applications délèguent la gestion de la mémoire et des périphériques aux programmes systèmes.
Pour simplifier, l'ensemble des programmes système porte le nom de système d'exploitation. Le rôle du système d'exploitation est d'être un intermédiaire entre les logiciels et le matériel. Après, cette définition est assez sommaire et les systèmes d'exploitation sont très variés et ont évolué avec le temps. Mais les programmes systèmes sont clairement le cœur de tout système d'exploitation, un cœur autour duquel s'articulent tout un écosystème de programmes applicatifs plus ou moins développé.

## Les niveaux de privilège

L'OS doit garantir que seuls les programmes systèmes ont accès aux périphériques ou aux registres de gestion de la mémoire virtuelle. Pour cela, les systèmes d'exploitation actuels incorporent des niveaux de privilège, aussi appelée anneaux mémoires. Dans chaque niveau de privilège, certaines manipulations du matériel sont impossibles et certaines opérations sont interdites. Plus le niveau de privilège est bas, moins il y a d'interdiction et plus on peut faire d'opérations risquées.
S'il a existé des systèmes d’exploitation avec quatre, sept ou huit niveaux de privilège, tous les processeurs des PC modernes (x86 64 bits) gèrent seulement deux niveaux de privilèges : un mode noyau pour le système d'exploitation et un mode utilisateur pour les applications. En mode noyau, tout est autorisé ou presque, alors que les accès aux périphériques sont interdits en mode utilisateur, de même que l'accès à certaines portions de la mémoire. Un programme en mode utilisateur ne peut pas accéder aux périphériques, lire ou écrire sur le disque dur, gérer certaines portions protégées de la mémoire, etc. Seul le noyau du système d'exploitation en est capable. C'est un mécanisme qui force à déléguer la gestion du matériel au système d'exploitation.
Sur certains processeurs, on trouve des niveaux de privilèges intermédiaires entre l'espace noyau et l'espace utilisateur. Les processeurs x86 des PC 32 bits contiennent 4 niveaux de privilèges. Le système Honeywell 6180 en possédait 8. À l'origine, ceux-ci ont été inventés pour faciliter la programmation des pilotes de périphériques. Certains d'entre eux peuvent en effet gagner à avoir des niveaux de privilèges intermédiaires entre celui d'une simple application et celui d'un OS. Mais force est de constater que ceux-ci ne sont pas vraiment utilisés, seuls les espaces noyau et utilisateur étant pertinents. Il en est de même pour beaucoup de méthodes de protection mémoire. Une des raisons à cet état de fait est tout simplement la compatibilité entre architectures matérielles différentes. Par exemple, les premières versions de Windows NT n'utilisaient que deux anneaux de privilèges sur les processeurs x86, en partie parce que d'autres jeux d'instructions supportés par Windows n'avaient que deux niveaux de privilèges. Ce n'est pas la seule raison, la facilité de programmation de l'OS devant aussi être prise en compte.
Les anneaux mémoire/niveaux de privilèges étaient au tout début gérés uniquement par le système d'exploitation par des mécanismes purement logiciels, les processeurs actuels gèrent directement les anneaux de protection. En général, le processeur contient un registre qui précise le niveau de privilège, si le programme en cours est en espace noyau ou en espace utilisateur. À chaque accès mémoire ou exécution d'instruction, le processeur vérifie si le niveau de privilège permet l'opération demandée. Lorsqu'un programme effectue une instruction interdite en mode utilisateur, une exception matérielle est levée. Généralement, le programme est arrêté sauvagement et un message d'erreur est affiché.

## Les appels systèmes

Tous les programmes systèmes sont des routines d'interruptions, fournies par l'OS ou les pilotes, qui permettent d'exploiter les périphériques. Les applications peuvent appeler à la demande ces routines via une interruption logicielle : ils effectuent ce qu'on appelle un appel système. Tout OS fournit un ensemble d'appels systèmes de base, qui servent à manipuler la mémoire, gérer des fichiers, etc. Par exemple, linux fournit les appels systèmes open, read, write et close pour manipuler des fichiers, les appels brk, sbrk, pour allouer et désallouer de la mémoire, etc. Évidemment, ceux-ci ne sont pas les seuls : linux fournit environ 380 appels systèmes distincts. Ceux-ci sont souvent encapsulés dans des librairies et peuvent s'utiliser comme de simples fonctions.
L'appel système se charge automatiquement de basculer le processeur dans l'espace noyau. Cette commutation n'est cependant pas gratuite, de même que l'interruption qui lui est associée. Ainsi, les appels systèmes sont généralement considérés comme lents, très lents. Divers processeurs incorporent des techniques pour rendre ces commutations plus rapides, via des instructions spécialisées (SYSCALL/SYSRET et SYSENTER/SYSEXIT d'AMD et Intel), ou d'autres techniques (call gate d’Intel, Supervisor Call instruction des IBM 360, etc.).
Sur les PC anciens, le BIOS fournissait les routines de base et le système d'exploitation se contentait d’exécuter les routines fournies par le BIOS. Mais de nos jours, le système d'exploitation fournit ses propres routines et contourne le BIOS en modifiant le vecteur d'interruption avec les adresses de ses routines. On dit qu'il détourne l'interruption.

## Le noyau du système d'exploitation

La portion du système d'exploitation placée dans l'espace noyau est ce qu'on appelle le noyau du système d’exploitation, le reste de l'OS étant composé d'applications qui servent, par exemple, à afficher une interface graphique ou une ligne de commande. Reste que beaucoup de programmes de l'OS peuvent être placés indifféremment dans le noyau ou dans l'espace utilisateur. Mais cela a un coût : exécuter un appel système est très lent, changer de niveau de privilège étant assez couteux. Conserver de bonnes performances impose de diminuer la quantité d'appels systèmes, et donc de placer un maximum de choses en espace noyau. Mais cela se fait au prix de la sécurité, toute erreur de programmation dans le noyau entrainant un écran bleu.

### Les types de noyaux : monolithique, micro-noyaux, hybrides

On peut classer les noyaux en plusieurs types, selon l'accent mit sur les performances ou la sécurité. Dans les grandes lignes, les deux types principaux correspondent à deux visions extrêmes de ce qu'est un noyau :
* Les noyaux monolithiques placent un maximum de programmes systèmes dans l'espace noyau.
* Les micro-noyaux préfèrent au contraire placer le plus de choses dans l'espace utilisateur.
Entre ces deux types, on trouve un grand nombre d'intermédiaires appelés des noyaux hybrides. Pour information, les systèmes Unix et Linux sont basés sur des noyaux monolithiques, tandis que les systèmes Windows et Mac OS utilisent des noyaux hybrides qui reprennent les avantages des noyaux monolithiques et des micro-noyaux.
Certaines versions relativement extrêmes de noyaux monolithiques, où tout l'OS est placé dans l'espace noyau, portent le nom de noyaux mégalithiques. De même, on trouve des versions extrêmes de micro-noyaux, où tout l'OS est composé de bibliothèques logicielles exécutées en espace utilisateur, à l'exception du minimum vital. On parle alors d'exokernel ou de nanokernel.
| Noyau monolithique modulaire. | Micro noyau hybride simplifié. | Micro noyau simplifié. |

### Les avantages et inconvénients de chaque type de noyau

Chaque type de noyau a ses avantages et ses inconvénients, mais on fait la différence surtout entre les deux extrêmes que sont les micro-noyaux et les noyaux monolithiques. Micro-noyaux et noyau monolithiques sont chacun l'opposé de l'autre du point de vue des performances et de la sécurité.
* Les micro-noyaux sont très fiables, avec peu d'écrans bleus, mais avec des performances moindre que les noyaux hybrides ou monolithiques. La raison tient à ce que la plupart des bogues et erreurs graves sont dans l'espace utilisateur, ce qui réduit le nombre d'écrans bleus. Avec eux, la majorité des erreurs de programmation n'entrainant pas un crash, mais simplement l'affichage d'un message d'erreur. Mais le nombre d'appels système est plus important que pour les noyaux monolithiques, ce qui est source de performances relativement faibles.
* Les noyaux monolithiques sont peu fiables, mais performants. Leurs performances excellentes viennent du fait que les appels systèmes à faire sont peu nombreux. Par contre, leur fiabilité est plutôt faible, la majorité des erreurs de programmation de l'OS se trouvant dans le noyau, source de beaucoup d'écrans bleus.
* Noyau monolithique
* Micro-noyau - appels système et services