1.3 Obtention Des Sources: Linux 0.01
1.3 Obtention Des Sources: Linux 0.01
1.3 Obtention Des Sources: Linux 0.01
périphériques, qu’un seul système de fichiers et qu’un seul type d’exécutables, mais ces défa
pour l’utilisateur deviennent un avantage lorsqu’on veut étudier les sources en entier.
Elle s’inspire de l’arborescence du source de Minix ([TAN-87], p. 104). Nous avons vu que les
systèmes d’exploitation se composent de quatre parties principales : le gestionnaire des proces-
sus,le gestionnaire de la mémoire, le gestionnaire des fichiers et le gestionnaire des périphé-
riques d’entrée-sortie. Le répertoire kernel correspond aux couches 1 et 2 de Minix (processus
et périphériques d’entrée-sortie). Les procédures des bibliothèques standard C utilisées par le
noyau o ( pen() , read() ,...) se trouvent dans le répertoire
lib (pour LIBrary). Les répertoires
mm(pour Memory Management)fset(pour File System) comportent le code du gestionnaire
de mémoire et du gestionnaire de fichiers.
Le répertoireinclude contient les fichiers d’en-têtes nécessaires au système Linux. Il sert à la
constitution du noyau, mais également à la programmation Linux une fois le noyau constitué.
Les trois derniers répertoires contiennent les outils de mise enleplace
répertoire
: boot per-
met de démarrer le système le répertoire
; init d’initialiser le système (il
ne contient que la
fonction principale
main() ) ; le répertoire
tools permet de construire le noyau.
Le répertoireinit
Le répertoireinit contient un seul
fichier :le fichiermain.c qui, comme son nom l’indique,
contient la fonction principale du codeCette
C. fonction initialise les périphériques (en mode
protégé) puis fait appel au processus 1.
Le répertoireinclude
Le répertoireinclude est évidemment le répertoire par défaut des fichiers d’en-têtes C qui ne
font pas partie de la bibliothèque C standard.
s’agit
Il des fichiers d’en-têtessont
qui propres
à Linux (propres à Unix pour la plupart) ou, faisant partie de la bibliothèque C standard, qui
doivent être implémentés suivant le système.
Ces fichiers se trouvent soit dans le répertoire
lui-même, soit dans l’un des trois sous-répertoires :
· asm contient des fichiers d’en-têtes dont le code est écrit en langage d’assemblage ;
· linux contient des fichiers d’en-têtes propres à Linux (n’existant pas sur les autres distribu-
tions Unix) ;
· sys est un sous-répertoire classique d’Unix,
contenant les fichiers d’en-têtes concernant le
système.
Le répertoire lui-même contient d’abord des fichiers d’en-têtes faisant partie de la biblio-
thèque standard C mais qu’ilfaut implémenter suivant le système (voir [PLAU-92] pour
plus de détails) :
· ctype.h (pour Character TYPEs) permet le traitement des caractères en distinguant
des classes de caractères (chiffre, alphabétique, espace...) ;
· errno.h (pour ERRor NumerO) permet d’associer un numéro à des constantes symbo-
liques représentant les erreurs rencontrées ;
· signal.h définit les valeurs de code d’un ensemble de signaux ;
· stdarg.h (pour STandarD ARGument) définit des macros permettant d’accéder aux
arguments d’une fonction, telle la fonction
printf() , acceptant une liste variable d’ar-
guments ;
· stddef.h (pour STandarD DEFinitions) contient un certain nombre de définitions stan-
dard (sic) ;
· string.h contient des fonctions permettant de manipuler les chaînes de caractères ;
· time.h concerne les calculs sur l’heure et la date.
Il contient ensuite des fichiers d’en-têtes propres à Unix :
· a.out.h contient le format propre au type d’exécutable
a.out , qui était le plus utilisé
avant l’arrivée du format
ELF ;
Chapitre 3.Le système Linux étudié
– 27
Le répertoirekernel
Il contient dix-sept fichiers, outre le fichier
Makefile :
· asm.s contient les routines de service de la plupart des 32 premières interruptions,
c’est-à-
dire de celles qui sont réservées par Intel :
Linux 0.01 /*
* asm.s contains the low-level code for most hardware faults.
* page_exception is handled by the mm, so that isn’t here. This
* file also handles (hopefully) fpu-exceptions due to TS-bit, as
* the fpu must be properly saved/resored. This hasn’t been tested.
*/
· console.c contient les paramètres, les variables et les fonctions nécessaires à l’affichage sur
le moniteur (nécessite les structures définissant un terminal) :
Linux 0.01 /*
* console.c
*
* This module implements the console io functions
* ’void con_init(void)’
* ’void con_write(struct tty_queue * queue)’
* Hopefully this will be a rather complete VT102 implementation.
*
*/
· panic.c contient une fonction utilisée par le noyau pour indiquer un problème grave :
/* Linux 0.01
* This function is used through-out the kernel (includeinh mm and fs)
* to indicate a major problem.
*/
· rs_io.c contient la routine de service associée aux interruptions matérielles des ports série
(rs rappelant la norme RS232) :
/* Linux 0.01
* rs_io.s
*
* This module implements the rs232 io interrupts.
*/
· traps.c contient le code en langage C des routines de service associées aux 32 premières
interruptions, c’est-à-dire celles réservées par Intel :
Linux 0.01 /*
* ’Traps.c’ handles hardware traps and faults after we have saved some
* state in ’asm.s’. Currently mostly a debugging-aid, will be extended
* to mainly kill the offending process (probably by giving it a signal,
* but possibly by killing it outright if necessary).
*/
Le répertoirelib
Le répertoirelib contient onze fichiers, outre le fichier
Makefile :
· _exit.c contient la définition de la fonction associée à l’appel système de terminaison d’un
processus _exit() ;
· close.c contient la définition de la fonction associée à l’appel
système de fermeture d’un
fichierclose() ;
· ctype.c contient la définition du tableau de définition des types de chacun des 256 carac-
tères (majuscule, chiffre...) ;
· dup.c contient la définition de la fonction associée à l’appel système
dup() ;
· errno.c contient la déclaration de la variable
errno ;
· execv.c contient la définition de la fonction associée à l’appel système
execv() ;
· open.c contient la définition de la fonction associée à l’appel
système d’ouverture d’un fi-
chieropen() ;
· setsid.c contient la définition de la fonction associée à l’appel système
setsid() ;
· string.c contient des directives de compilation ;
· wait.c contient la définition de la fonction associée à l’appel système
wait() ;
· write.c contient la définition de la fonction associée à l’appel
système d’écriture sur un
fichierwrite() .
Le répertoirefs
Le répertoirefs contient dix-huit fichiers, outre le fichier
Makefile :
· bitmap.c contient le code permettant de gérer les tables de bits d’utilisation des nœuds
d’information et des blocs :
Linux 0.01 /* bitmap.c contains the code that handles the inode and block bitmaps */
Chapitre 3.Le système Linux étudié
– 31
Le répertoiremm
Le répertoiremmcontient deux fichiers, outre le fichier
Makefile :
· memory.c contient les fonctions concernant la gestion des pages ;
· page.s contient la routine de service de l’interruption matérielle concernant le défaut de
page :
/* Linux 0.01
* page.s contains the low-level page-exception code.
* the real work is done in mm.c
*/
Le répertoiretools
Le répertoiretools contient un seul
fichier :build.c . Il s’agit d’un programme C indépen-
dant qui permet de construire l’image du noyau.
32 – Première partiePrincipes
: de conception des systèmes d’exploitation
voyons comment l’accès aux ports d’entrée-sortie est encapsulé dans des macros et comment
les interruptions, que ce soit les exceptions réservées par Intel, les interruptions matérielles ou
la seule interruption logicielle de Linux sont initialisées sous Linux, sans étudier, pour l’instant,
les gestionnaires associés.
La troisième partie de notre étude est consacrée aux grandes structures de données utilisées
par Linux. Dans le chapitre 6,nous étudions en détailla structure des descripteurs de pro-
cessus,la table des processus et la tâche initiale,
c’est-à-dire ce qui
concerne l’aspect statique
des processus en mode noyau. Dans le chapitre nous7,étudions la mise en place des fichiers,
c’est-à-dire ce qui concerne l’aspect statique des fichiers en mode noyau, plus exactement nous
entreprenons une étude générale des fichiers dans les divers types de systèmes d’exploitation,
les caractéristiques des fichiers sous Unix, la structure d’un disque Minix (qui est le seul sys-
tème de fichiers accepté par le noyau 0.01 de Linux), les structures de données liées aux fichiers
en mode noyau (antémémoire, nœuds d’information, super-blocs et descripteurs de fichiers) et,
enfin,la façon dont on désigne les fichiers de périphériques sous Linux.
Dans le chapitre 8,
nous étudions la mise en place des terminaux à haut niveau, ceci regroupant à la fois l’encap-
sulation du clavier, de l’affichage sur le moniteur et des deux liaisons série. Nous n’entrons pas,
dans ce chapitre, dans le détail des pilotes pour ces trois types de périphériques.
La quatrième partie est consacrée à la mise en place de l’aspect dynamique du mode noyau
qui ne donne pas lieu à affichage en cas d’erreur (tout simplement parce que nous n’avons pas
vu comment celui-ciest mis en place).
Dans le chapitre 9,nous voyons comment les appels
système sont mis en place,
sans les étudier un par un pour l’instant.
Dans le chapitre 10,
nous étudions la mise en place de la mesure du temps,
que ce soit l’horloge temps réel
ou les
minuteurs. Dans le chapitre 11, nous étudions la commutation des tâches et l’ordonnancement
des processus. Dans le chapitrenous
12, étudions la notion générale de signal puis la mise en
place des signaux sous Linux.
La cinquième partie est consacrée à l’affichage.
Dans le chapitre 14,nous étudions la mise
en place du pilote d’écran sous Linux.
Dans le chapitre 15,
nous étudions la mise en place de
l’affichage formaté, ce qui nous conduit à étudier la mise en place des fonctions de bibliothèque
ayant un nombre variable d’arguments.
La sixième partie est consacrée à la mise en place de l’aspect dynamique du mode noyau fai-
sant intervenir l’affichage de messages d’erreur. Dans le chapitre 16, nous étudions les gestion-
naires des exceptions sauf celui concernant le défaut de page, reporté dans le chapitre suivant.
Dans le chapitre 17, nous étudions la notion de mémoire virtuelle de façon générale puis sa
mise en place sous Linux.
La septième partie est consacrée à l’étude des fichiers réguliers.
Dans le chapitre 19,nous
étudions la notion de cache du disque dur et sa mise en place sous Linux. Dans le chapitre 18,
nous étudions la mise en place du pilote du disque c’est-à-dire
dur, l’accès au disque dur à
bas niveau.Dans le chapitre 20,
nous étudions la mise en place des périphériquesc’est-
bloc,
à-dire l’accès au disque dur à haut niveau.
Dans le chapitre 21,
nous étudions la gestion des
nœuds d’information. Dans le chapitre 22, nous étudions la gestion des fichiers réguliers et des
répertoires.
La huitième partie est consacrée à l’étude des périphériques caractère.
Dans le chapitre 23,
nous étudions le pilote du clavier.
Dans le chapitre 24,nous étudions le pilote des liaisons
série. Dans le chapitre 25, nous étudions les périphériques caractère.
34 – Première partiePrincipes
: de conception des systèmes d’exploitation
La neuvième partie,
à chapitre unique 26,
est consacrée à l’étude de la communication par
tubes entre processus.
La dixième partie est consacrée à la mise en place du mode utilisateur,
c’est-à-dire à la mise
en place des appels système et des fonctions de bibliothèques.
Dans le chapitre 27, les appels
système concernant le système de fichiers sont mis enDans
place.le chapitre 28,les appels
système concernant les processus sont mis en place.
Dans le chapitre 29,les autres appels
système sont mis en place.
Dans le chapitre 30,
les fonctions de la bibliothèque C sont mises
en place.
La onzième partie, à chapitre unique 31, est consacrée au démarrage du système.
4 Évolution du noyau
Linux 2.2.18 Les sources du noyau 2.2.18 occupent 4 500 fichiers de C et de langage d’assemblage conten
dans près de 270 sous-répertoires
elles
; totalisent quelques deux millions de lignes de code
représentant près de 58 Mo.
· /Documentation ;
· /arch ;
· /crypto est un nouveau répertoire qui concerne la cryptographie ;
· /drivers ;
· /fs ;
· /include ;
· /init ;
· /ipc ;
· /kernel ;
· /lib ;
· /mm;
· /net ;
· /scripts ;
· /security est un nouveau répertoire relatif à la sécurité ;
· /sound est un nouveau répertoire traitant du son ;
· /usr est un nouveau répertoire pour les fichiers auxiliaires.
Conclusion
Il existe de très nombreux systèmes d’exploitation.
Les versions successives de chacun d’eux
permettent d’une part d’améliorer ce que l’on peut appeler le micro-noyau du système et,
d’autre part,de prendre en compte les changements essentiels dans le (par
matériel
exemple
les réseaux ou les périphériques USB). Nous avons expliqué pourquoi il vaut mieux s’intéresser,
dans une première étape, au tout premier noyau, la version 0.01 de Linux, pour enchaîner sur
ses évolutions (il
en est actuellement à sa version 2.6).
Nous verrons dans les deux chapitres
suivants en quoi un système d’exploitation dépend du micro-processeur.