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

Un livre de Wikilivres.
Aller à : navigation, rechercher
Séparation entre programmes systèmes et applicatifs.

Au tout début de l'informatique, les logiciels n'étaient pas compatibles sur une large gamme de matériel. 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.

Anneaux mémoire[modifier | modifier le wikicode]

Niveaux de privilèges sur les processeurs x86.

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 processeurs actuels incorporent une technique : les anneaux mémoires. Dans les grandes lignes, le processeur gère deux niveaux de privilèges : un mode noyau pour les programmes systèmes, où les instructions d'accès aux périphériques peuvent s’exécuter, et un mode utilisateur pour les applications, où ces opérations sont interdites.

Ces anneaux mémoire/niveaux de privilèges, sont gérés en partie par le processeur. Celui-ci contient un registre qui précise s'il 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é. Un programme ne peut changer d'anneau mémoire au cours de son exécution, sous certaines conditions relativement drastiques, afin d'éviter que tout programme s'arroge des droits d'accès aux périphériques sans restrictions.

Sur certains processeurs, on trouve des niveaux de privilèges intermédiaires entre l'espace noyau et l'espace utilisateur. Les processeurs de nos PC actuels contiennent 4 niveaux de privilèges. Le système Honeywell 6180 en possédait 8. À l'origine, ceux-ci ont étés 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.

Appels systèmes[modifier | modifier le wikicode]

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. Sur les PC actuels, où le BIOS fournit des routines de base, l'OS doit modifier le vecteur d'interruption avec les adresses de ses routines. On dit qu'il détourne l'interruption. 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 de Intel, Supervisor Call instruction des IBM 360, etc.).

Le noyau du système d'exploitation[modifier | modifier le wikicode]

Séparation entre noyau et applications.

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 à afficher une interface graphique ou une ligne de commande, par exemple. 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. On peut ainsi classer les noyaux en plusieurs types, selon l'accent mit sur les performances ou la sécurité.

  • Les noyaux monolithiques placent un maximum de programmes systèmes dans l'espace noyau. Leurs performances sont donc excellentes, vu 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.
  • Les micro-noyaux préfèrent au contraire placer le plus de choses dans l'espace utilisateur. Leur sécurité est excellente, 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 nettement plus important que pour les noyaux monolithiques, ce qui est source de performances relativement faibles.
  • Les noyaux hybrides, sont un intermédiaire entre les deux précédents.
  • 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.

Pour information, les systèmes Unix et Linux sont basés sur des noyaux monolithiques, tandis que les systèmes Windows utilisent des micro-noyaux.

Noyau monolithique modulaire.
Micro noyau hybride simplifié.
Micro noyau simplifié.