Introduction
Un aperçu des systèmes Unix et de Linux. L'utilisation du matériel par les programmes se fait via le noyau, les programmes appellent le noyau via les appels systèmes, et celui-ci effectue les opérations pour le compteur du programme.
Système d'exploitation et noyau
Un système d'exploitation est un ensemble de "programmes" permettant aux utilisateurs et aux applications d'exploiter les ressources d'un système informatique.
Le terme noyau désigne le coeur d'un système d'exploitation, principalement la partie qui s'occupe du dialogue avec les ressources matérielles.
Ces définitions, très vagues, sont parfois confondues. Le terme Linux désigne un noyau tandis qu'on parle plutôt de système GNU/Linux pour désigner un système d'exploitation dont le noyau est Linux et constitué d'un ensemble de composants logiciels développés par le projet GNU tels que le compilateur GCC, la bibliothèque C glic, le shell bash, un ensemble d'utilitaires standards des systèmes UNIX, ...
Il n'est pas facile de définir de manière tout à fait générale la notion de système d'exploitation ou de noyau car ceux-ci peuvent avoir des vocations très diverses: équiper un poste de travail, un serveur, un routeur réseau, permettre un fonctionnement temps réel, ...
Les systèmes de type UNIX
Les caractéristiques que nous verrons de ces systèmes sont les suivantes.
- La possibilité d'exécuter simultanément plusieurs programmes. Cette simultanéité n'est qu'apparente, les programmes s'exécutent en fait en alternance sur le/les processeur(s). On dit du système qu'il est multitâche.
- Le contrôle de l'accès des programmes à certaines ressources protégées. Ces systèmes sont sécurisés.
Les programmes n'ont pas accès directement à certaines ressources. Cet accès s'effectue sous le contrôle du noyau. Les programmes n'ont par exemple pas accès directement aux périphériques.
L'accès à l'espace mémoire d'un autre programme est interdit sauf pour
une zone mémoire explicitement partagée. Le système partage
équitablement les ressources (principalement processeur et mémoire)
entre les programmes. Les programmes ne peuvent pas mettre en péril la stabilité du système.
Les systèmes UNIX sont multi-utilisateurs. Un programme est attaché à un utilisateur (et des groupes) et l'accès à certaines ressources (les fichiers, par exemple) peut être limité au niveau des opérations possibles (lecture, écriture, exécution) en fonction de l'utilisateur et des groupes attachés aux programmes qui tentent d'y accéder.
Mise en oeuvre
Pour accéder aux ressources protégées, un programme doit obligatoirement invoquer des routines (fonctions) du noyau: les appels systèmes (system call).
Les appels systèmes sont ces fonctions qui s'assurent que le programme peut réaliser l'opération demandée et qui exécutent celle-ci sur les ressources pour le compte du programme. Par exemple, l'ouverture d'un fichier en lecture/écriture, la lecture ou l'écriture dans celui-ci ...
Ces fonctions constituent donc une interface entre les programmes et les ressources. Elles offrent aussi l'avantage de masquer/abstraire les détails de réalisation d'une opération. Par exemple, pour accéder à un fichier sur disque, un programme ne doit pas manipuler des n° de tête, de cylindre et de secteur mais se contente de spécifier un chemin dans l'arborescence de fichiers. Ce sont les routines du noyau qui à partir du chemin effectueront les traitements nécessaires pour accéder aux données du fichier sur le disque. Le programme ne doit même pas se préoccuper de savoir si le fichier réside sur disque, sur CD/DVD, sur clé USB, sur un lecteur partagé au travers d'un réseau, en mémoire,... les fonctions du noyau lui permettront d'accéder au fichier à partir d'un chemin indépendamment de son support physique, et ce de manière tout à fait transparente.
Pour le développeur d'application Unix, le noyau constitue donc une sorte d'API ou encore de machine virtuelle qui donne l'impression au programme que le système dispose de certaines fonctionnalités qui sont en fait mises en oeuvre par les fonctions du noyau.
Cet API, telle qu'un système comme Linux la propose, correspondent quasi directement aux spécifications SUS (Single UNIX Specifications) proposées par l'Open Group (http://www.opengroup.org) qui définissent en langage C (sans en préciser l'implémentation) un ensemble de fonctions que devrait proposer un système de type UNIX. Dans Linux, une grande partie de ces fonctions sont réalisées directement par des appels système.
Exigences matérielles
Un tel type de système ne peut fonctionner sur n'importe quelle architecture matérielle. Celle-ci doit répondre à quelques exigences, essentiellement au niveau du processeur.
Celui-ci doit proposer au moins deux modes de fonctionnement:
- Un mode sans restriction où toutes les opérations sont permises: le mode noyau (kernel mode). C'est dans ce mode que s'exécutent les fonctions du noyau.
- Un mode où certaines instructions sont interdites: le mode utilisateur (user mode). C'est dans ce mode que s'exécutent les programmes.
Une instruction du processeur doit permettre l'invocation d'un appel système et doit provoquer le basculement du mode utilisateur au mode noyau. Le retour d'un appel système doit provoquer le basculement inverse.
Le processeur doit fournir un mécanisme de mémoire virtuelle gérée en collaboration avec le noyau, qui, outre le fait qu'il simplifie la gestion de la mémoire, cantonne l'accès d'un programme à des zones de mémoire physique qui lui sont allouée par le noyau et permet également le partage de zone mémoire entre plusieurs programmes.
Il faut aussi disposer d'un mécanisme qui permet d'invoquer régulièrement une fonction du noyau pour attribuer le(s) processeur(s) à un/d'autre(s) programme(s) (signal d'horloge).

