Vous êtes sur la page 1sur 13

Chapitre 3

Le systme Linux tudi


La plupart des articles et des livres consacrs au noyau Linux prennent toujours en exemple la dernire version disponible au moment o ils sont crits, qui nest dj plus la dernire version au moment o ils paraissent. De plus, comme le source est alors dune taille trs importante, une seule partie de celui-ci est tudie. Je ne pense pas que ce soit une bonne ide. Si nous voulons vraiment comprendre la structure dun systme dexploitation, nous avons intrt considrer le systme le plus simple possible et ltudier en entier. Cest pourquoi jai choisi la toute premire version du noyau Linux : le noyau 0.01. Je donnerai cependant quelques indications sur lvolution du noyau, mais ce nest pas le but essentiel.

1 Le systme Linux tudier


1.1 Noyau et distribution
Le systme dexploitation Linux est un gros logiciel et, comme tel, dicile apprhender par une seule personne. Mais, en fait, il faut distinguer plusieurs niveaux. Ce que lon entend par Linux, le plus souvent, concerne une distribution, telle que Red Hat, Suse, Mandrake, Debian... Une distribution comprend le systme dexploitation proprement dit, plus exactement le noyau, les utilitaires traditionnellement associs Unix (un diteur de texte, un compilateur C...), linterface graphique X Window System1 et beaucoup de logiciels utilisateur. Notre but, dans ce livre, est uniquement dtudier le noyau Linux.

1.2 Noyau minimal


Mme pour le seul noyau, les sources ont une taille non ngligeable : 58 Mo pour la version 2.2.18, par exemple. Ceci sexplique, en particulier, par le grand nombre de priphriques pris en compte. Il est videmment inutile de soccuper de tous les priphriques et de tous les types de tels priphriques du point de vue pdagogique. Nous tudierons donc un noyau minimal, ne mettant pas ncessairement toutes les activits en application et ne contenant que quelques priphriques titre dexemple. Le noyau Linux 0.01 est intressant du point de vue pdagogique. Il ne concerne que le microprocesseur Intel 80386 (et ses successeurs), il ne prend en compte quun nombre trs limit de
1 On utilise souvent, tort, le terme X Window. Le consortium X, auteur du programme, recommande plutt demployer les termes X ou X Window System pour voquer ce produit.

Linux 0.01

24 Premire partie : Principes de conception des systmes dexploitation priphriques, quun seul systme de chiers et quun seul type dexcutables, mais ces dfauts pour lutilisateur deviennent un avantage lorsquon veut tudier les sources en entier.

1.3 Obtention des sources


Lensemble des sources des noyaux de Linux, depuis le tout premier jusquau dernier, se trouve sur le site : http://ftp.cdut.edu.cn/pub/linux/kernel/history/
Linux 0.01

Nous tudierons, dans une premire tape, les sources du tout premier noyau, nettement moins imposant et contenant videmment lessentiel. Les sources du noyau 0.01 se trouvent galement ladresse suivante : http://www.kernel.org/pub/linux/kernel/Historic/

1.4 Programmation Linux


Lobtention du noyau Linux et la comprhension des chiers source nous entranent faire un dtour par la programmation sous Linux. A priori, nous ne devrions rien avoir dire sur la programmation. Que ce soit Linux ou un autre systme dexploitation, nous devrions avoir des sources portables. En fait, ce nest pas le cas pour des raisons historiques dues certains choix initiaux de Linus Torvalds, jamais remis en cause ensuite. Les sources reposent sur des chiers make (un outil pour grer les grands logiciels rpartis sur de nombreux chiers), sur des chiers en langage C non standard (il sagit du langage C de GCC avec quelques utilisations de particularits de ce compilateur), sur des chiers en langage dassemblage, pour Intel 80386 pour ce qui nous concerne et, enn, sur des scripts bash modis. La syntaxe du langage dassemblage ne suit pas celle de lassembleur MASM de Microsoft (qui fut longtemps la rfrence) mais celle de gas dans un style dit ATT.

1.5 Versions du noyau Linux


Linux distingue les noyaux stables des noyaux en dveloppement avec un systme de numrotation simple. Chaque version est caractrise par trois nombres entiers spars par des points. Les deux premiers identient la version, le troisime la parution (release en anglais). Un second numro pair identie un noyau stable ; impair, il dnote un noyau de dveloppement. Les nouvelles parutions dune version stable visent essentiellement corriger des erreurs signales par les utilisateurs ; les algorithmes principaux et les structures de donnes du noyau ne sont pas modis. Les versions de dveloppement, en revanche, peuvent direr les unes des autres de faon importante. Les dveloppeurs du noyau sont libres dexprimenter direntes solutions qui peuvent ventuellement conduire des changements drastiques du noyau. La notation de la version 0.01 ne suit pas le principe de la numrotation dcrit ci-dessus avec trois nombres entiers spars par des points. Linus Torvalds voulant seulement indiquer que nous sommes trs loin dune version stable, qui porterait le numro 1.0, il a choisi le numro 0.01 pour laisser de la place pour encore dautres versions intermdiaires.

Chapitre 3. Le systme Linux tudi 25

2 Les sources du noyau 0.01


2.1 Vue densemble sur larborescence
Les sources du noyau 0.01 occupent 230 Ko, comportent 11 dossiers et 88 chiers. Le premier niveau de larborescence du source est simple :
/boot /fs /include /init /kernel /lib /mm /tools

Linux 0.01

Elle sinspire de larborescence du source de Minix ([TAN-87], p. 104). Nous avons vu que les systmes dexploitation se composent de quatre parties principales : le gestionnaire des processus, le gestionnaire de la mmoire, le gestionnaire des chiers et le gestionnaire des priphriques dentre-sortie. Le rpertoire kernel correspond aux couches 1 et 2 de Minix (processus et priphriques dentre-sortie). Les procdures des bibliothques standard C utilises par le noyau (open(), read(),...) se trouvent dans le rpertoire lib (pour LIBrary). Les rpertoires mm (pour Memory Management) et fs (pour File System) comportent le code du gestionnaire de mmoire et du gestionnaire de chiers. Le rpertoire include contient les chiers den-ttes ncessaires au systme Linux. Il sert la constitution du noyau, mais galement la programmation Linux une fois le noyau constitu. Les trois derniers rpertoires contiennent les outils de mise en place : le rpertoire boot permet de dmarrer le systme ; le rpertoire init dinitialiser le systme (il ne contient que la fonction principale main()) ; le rpertoire tools permet de construire le noyau.

2.2 Larborescence dtaille


Le rpertoire boot Pour le noyau 0.01, ce rpertoire ne contient que deux chiers en langage dassemblage : boot.s et head.s. Voici les fonctions des ces deux chiers : boot.s contient le code du secteur damorage de la disquette partir de laquelle on dmarre Linux, de linitialisation des priphriques de lordinateur, de la conguration de lenvironnement pour pouvoir passer en mode protg des micro-processeurs Intel et, enn, du passage au mode protg ; il donne ensuite la main au code startup_32() contenu dans le chier suivant :
| | | | | | | | | | boot.s boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there. It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in its own tables, and enable interrupts as needed.

Linux 0.01

26 Premire partie : Principes de conception des systmes dexploitation head.s permet de congurer lenvironnement dexcution pour le premier processus Linux (processus 0) puis de passer la fonction start_kernel(), qui est la fonction principale du code C :
Linux 0.01
/* * head.s contains the 32-bit startup code. * * NOTE!!! Startup happens at absolute address 0x00000000, which is also * where the page directory will exist. The startup code will be * overwritten by the page directory. */

Le rpertoire init Le rpertoire init contient un seul chier : le chier main.c qui, comme son nom lindique, contient la fonction principale du code C. Cette fonction initialise les priphriques (en mode protg) puis fait appel au processus 1. Le rpertoire include Le rpertoire include est videmment le rpertoire par dfaut des chiers den-ttes C qui ne font pas partie de la bibliothque C standard. Il sagit des chiers den-ttes qui sont propres Linux (propres Unix pour la plupart) ou, faisant partie de la bibliothque C standard, qui doivent tre implments suivant le systme. Ces chiers se trouvent soit dans le rpertoire lui-mme, soit dans lun des trois sous-rpertoires : asm contient des chiers den-ttes dont le code est crit en langage dassemblage ; linux contient des chiers den-ttes propres Linux (nexistant pas sur les autres distributions Unix) ; sys est un sous-rpertoire classique dUnix, contenant les chiers den-ttes concernant le systme. Le rpertoire lui-mme contient dabord des chiers den-ttes faisant partie de la bibliothque standard C mais quil faut implmenter suivant le systme (voir [PLAU-92] pour plus de dtails) : ctype.h (pour Character TYPEs) permet le traitement des caractres en distinguant des classes de caractres (chire, alphabtique, espace...) ; errno.h (pour ERRor NumerO) permet dassocier un numro des constantes symboliques reprsentant les erreurs rencontres ; signal.h dnit les valeurs de code dun ensemble de signaux ; stdarg.h (pour STandarD ARGument) dnit des macros permettant daccder aux arguments dune fonction, telle la fonction printf(), acceptant une liste variable darguments ; stddef.h (pour STandarD DEFinitions) contient un certain nombre de dnitions standard (sic) ; string.h contient des fonctions permettant de manipuler les chanes de caractres ; time.h concerne les calculs sur lheure et la date. Il contient ensuite des chiers den-ttes propres Unix : a.out.h contient le format propre au type dexcutable a.out, qui tait le plus utilis avant larrive du format ELF ;

Chapitre 3. Le systme Linux tudi 27


const.h contient diverses valeurs de constantes ; fcntl.h contient les fonctions permettant de manipuler les descripteurs de chiers ; termios.h contient les constantes et les fonctions concernant les terminaux ; unistd.h (pour UNIx STandarD) contient les constantes et les fonctions standard

dUnix ;

utime.h (pour User TIME) permet de changer la date et lheure dun nud dinformation. Le sous-rpertoire asm contient quatre chiers : io.h (pour Input/Output) contient la dnition des macros, en langage dassemblage, permettant daccder aux ports dentre-sortie ; memory.h contient la dnition de la macro memcpy() ; segment.h contient la dnition des fonctions en ligne dcriture et de lecture dun octet, dun mot ou dun mot double ; system.h contient la dnition de fonctions ncessaires linitialisation. Le sous-rpertoire linux contient neuf chiers : config.h contient les donnes ncessaires au dmarrage du systme (concernant la capacit mmoire et le disque dur) ; fs.h (pour File System) contient les dnitions des tableaux de structures pour les chiers ; hdreg.h (pour Hard Disk REGisters) contient des dnitions pour le contrleur de disque dur de lIBM PC-AT ; head.h contient des constantes ncessaires pour le chier head.s ; kernel.h contient la dclaration de fonctions ncessaires pour le mode noyau (comme la fonction printk()) ; mm.h (pour Memory Management) contient la dclaration de fonctions de manipulation de la mmoire ; sched.h (pour SCHEDuler) contient la dnition des structures et la dclaration des fonctions ncessaires la manipulation des processus ; sys.h (pour SYStem call) contient la dclaration des appels systme ; tty.h contient la dnition de structures et la dclaration de fonctions concernant le terminal (tty pour TeleTYpe), ncessaires pour le chier tty_io.c ci-dessous. Le sous-rpertoire sys contient cinq chiers : stat.h contient la dclaration des fonctions renvoyant les informations sur les chiers ; times.h contient la dclaration de la fonction renvoyant le nombre de tops dhorloge couls depuis le dmarrage du systme ; types.h contient la dnition dun certain nombre de types ; utsname.h contient la dclaration de la fonction donnant le nom et des informations sur le noyau ; wait.h contient la dclaration des fonctions permettant de suspendre lexcution du processus en cours jusqu ce un processus ls se termine ou quun signal soit envoy.

28 Premire partie : Principes de conception des systmes dexploitation Le rpertoire kernel Il contient dix-sept chiers, outre le chier Makefile : asm.s contient les routines de service de la plupart des 32 premires interruptions, cest-dire de celles qui sont rserves 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 isnt here. This * file also handles (hopefully) fpu-exceptions due to TS-bit, as * the fpu must be properly saved/resored. This hasnt been tested. */

console.c contient les paramtres, les variables et les fonctions ncessaires lachage sur le moniteur (ncessite les structures dnissant 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. * */

exit.c contient les fonctions ncessaires pour quitter un processus autrement que par return ; fork.c contient les fonctions ncessaires pour crer un processus ls :
Linux 0.01
/* * fork.c contains the help-routines for the fork system call * (see also system_call.s), and some misc functions (verify_area). * Fork is rather simple, once you get the hang of it, but the memory * management can be a bitch. See mm/mm.c: copy_page_tables() */

hd.c contient le pilote du disque dur :


Linux 0.01
/* * This code handles all hd-interrupts, and read/write requests to * the hard-disk. It is relatively straigthforward (not obvious maybe, * but interrupts never are), while still being efficient, and never * disabling interrupts (except to overcome possible race-condition). * The elevator block-seek algorithm doesnt need to disable interrupts * due to clever programming. */

keyboard.s contient la routine de service associe IRQ1, cest--dire linterruption matrielle provenant du clavier ; mktime.c contient la fonction permettant de transformer la date exprime en secondes depuis 1970 en anne, mois, jour, heure, minute et seconde :
Linux 0.01
/* * This isnt the library routine, it is only used in the kernel. * as such, we dont care about years<1970 etc, but assume everything * is ok. Similarly, TZ etc is happily ignored. We just do everything * as easily as possible. Lets find something public for the library * routines (although I think minix times is public). */ /* * PS. I hate whoever though up the year 1970 - couldnt they have gotten * a leap-year instead? I also hate Gregorius, pope or no. Im grumpy. */

Chapitre 3. Le systme Linux tudi 29 panic.c contient une fonction utilise par le noyau pour indiquer un problme grave :
/* * This function is used through-out the kernel (includeinh mm and fs) * to indicate a major problem. */

Linux 0.01

printk.c contient une fonction analogue la fonction printf() du langage C mais qui peut tre utilise par le noyau :
/* * When in kernel-mode, we cannot use printf, as fs is liable to * point to interesting things. Make a printf with fs-saving, and * all is well. */

Linux 0.01

rs_io.c contient la routine de service associe aux interruptions matrielles des ports srie (rs rappelant la norme RS232) :
/* * rs_io.s * * This module implements the rs232 io interrupts. */

Linux 0.01

sched.c contient le squenceur (scheduler en anglais) qui permet de changer de processus pour rendre le systme dexploitation multi-tches :
/* * sched.c is the main kernel file. It contains scheduling primitives * (sleep_on, wakeup, schedule etc) as well as a number of simple system * call functions (type getpid(), which just extracts a field from * current-task */

Linux 0.01

serial.c contient limplmentation de deux fonctions servant aux ports srie :


/* * serial.c * * This module implements the rs232 io functions * void rs_write(struct tty_struct * queue); * void rs_init(void); * and all interrupts pertaining to serial IO. */

Linux 0.01

sys.c contient la dnition de beaucoup de fonctions de code sys_XX() dappels systme ; system_call.s contient du code en langage dassemblage permettant dimplmenter les appels systme :
/* * system_call.s contains the system-call low-level handling routines. * This also contains the timer-interrupt handler, as some of the code is * the same. The hd-interrupt is also here. * * NOTE: This code handles signal-recognition, which happens every time * after a timer-interrupt and after each system call. Ordinary interrupts * dont handle signal-recognition, as that would clutter them up totally * unnecessarily. * * -----------------------------------------------------------------------*/

Linux 0.01

30 Premire partie : Principes de conception des systmes dexploitation traps.c contient le code en langage C des routines de service associes aux 32 premires interruptions, cest--dire celles rserves 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). */

tty_io.c contient les fonctions ncessaires au fonctionnement du terminal :


Linux 0.01
/* * tty_io.c gives an orthogonal feeling to ttys, be they consoles * or rs-channels. It also implements echoing, cooked mode etc (well, * not currently, but ...) */

vsprintf.c contient le code permettant de dnir la fois les fonctions printk() et printf() :
Linux 0.01
/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ /* * Wirzenius wrote this portably, Torvalds fucked it up:-) */

Le rpertoire lib Le rpertoire lib contient onze chiers, outre le chier Makefile : _exit.c contient la dnition de la fonction associe lappel systme de terminaison dun processus _exit() ; close.c contient la dnition de la fonction associe lappel systme de fermeture dun chier close() ; ctype.c contient la dnition du tableau de dnition des types de chacun des 256 caractres (majuscule, chire...) ; dup.c contient la dnition de la fonction associe lappel systme dup() ; errno.c contient la dclaration de la variable errno ; execv.c contient la dnition de la fonction associe lappel systme execv() ; open.c contient la dnition de la fonction associe lappel systme douverture dun chier open() ; setsid.c contient la dnition de la fonction associe lappel systme setsid() ; string.c contient des directives de compilation ; wait.c contient la dnition de la fonction associe lappel systme wait() ; write.c contient la dnition de la fonction associe lappel systme dcriture sur un chier write(). Le rpertoire fs Le rpertoire fs contient dix-huit chiers, outre le chier Makefile : bitmap.c contient le code permettant de grer les tables de bits dutilisation des nuds dinformation et des blocs :
Linux 0.01
/* bitmap.c contains the code that handles the inode and block bitmaps */

Chapitre 3. Le systme Linux tudi 31 block_dev.c contient le code permettant de grer les priphriques bloc ; buffer.c contient le code permettant de grer lantmmoire de blocs :
/* * buffer.c implements the buffer-cache functions. Race-conditions have * been avoided by NEVER letting an interrupt change a buffer (except for * the data, of course), but instead letting the caller do it. NOTE! As * interrupts can wake up a caller, some cli-sti sequences are needed to * check for sleep-on-calls. These should be extremely quick, though * (I hope). */

Linux 0.01

char_dev.c contient le code permettant de grer les priphriques caractre ; exec.c contient le code permettant dexcuter un nouveau programme ; fcntl.c contient le code permettant de manipuler les descripteurs de chiers ; file_dev.c contient les fonctions dcriture et de lecture dans un chier ordinaire ; file_table.c contient la dclaration de la table des chiers ; inode.c contient la dclaration de la table des nuds dinformation en mmoire ainsi que

les fonctions permettant de la grer ; ioctl.c contient la dclaration de la table ioctl[] et quelques fonctions associes ; namei.c (pour NAME I-node) contient les fonctions permettant de nommer les chiers ; open.c contient les fonctions permettant douvrir et de changer les droits daccs dun chier ; pipe.c permet de mettre en place les tubes de communication ; read_write.c contient les fonctions permettant de se positionner, de lire et dcrire sur un chier ; stat.c contient les fonctions permettant dobtenir des informations sur un chier ; super.c contient les dnitions et les fonctions concernant les super-blocs ; truncate.c contient les fonctions permettant deacer un chier ; tty_ioctl.c contient les fonctions permettant de paramtrer un terminal.

Le rpertoire mm Le rpertoire mm contient deux chiers, outre le chier Makefile : memory.c contient les fonctions concernant la gestion des pages ; page.s contient la routine de service de linterruption matrielle concernant le dfaut de page :
/* * page.s contains the low-level page-exception code. * the real work is done in mm.c */

Linux 0.01

Le rpertoire tools Le rpertoire tools contient un seul chier : build.c. Il sagit dun programme C indpendant qui permet de construire limage du noyau.

32 Premire partie : Principes de conception des systmes dexploitation

3 Vue densemble sur limplmentation


3.1 Caractristiques
La version 0.01 de Linux na pas pour but dtre volue : Architecture. Elle ne supporte que les micro-processeurs 80386 dIntel et ses descendants, grce la compatibilit ascendante de ceux-ci. Elle ne gre videmment que les systmes un seul micro-processeur. Mmoire. Elle gre la mmoire grce au mcanisme de pagination. La mmoire physique est limite 8 Mo, ce qui tait dj norme pour 1991. Cette limitation peut cependant tre tendue sans trop de modications. La capacit de la mmoire physique nest pas dtecte par le noyau, il faut la congurer manuellement. Disque dur. On ne peut utiliser que des disques IDE et seul le premier contrleur est pris en charge. Comme pour la mmoire, les paramtres des disques durs doivent tre entrs avant la compilation. Priphriques. La version 0.01 ne gre que deux disques durs, la console (clavier et cran texte) et deux modems (via deux ports srie). Elle ne gre ni le lecteur de disquettes, ni le port parallle (donc pas dimprimante), ni la souris, ni les cartes graphiques (autres que texte), ni les cartes son ou autres priphriques (ISA, PCI ou autre). Elle nutilise pas la DMA (Direct Memory Access). Gestion des processus. Linux 0.01 est multi-tches et multi-utilisateurs. Il peut grer 64 tches simultanes (ce nombre est aisment extensible) et 65 536 utilisateurs. Aucun utilitaire grant les utilisateurs (login, su, passwd,...) nest fourni et une seule console est implmente. Systme de chiers. Le systme de chiers utilis par Linux 0.01 est celui de la premire version de Minix. Il gre des chiers avec des noms de 14 caractres au plus et une taille maximale de 64 Mo par chier. Rseau. Le support rseau ntait pas implment sur Linux 0.01. La toute premire version est donc rudimentaire du point de vue de lutilisation mais elle est susante titre pdagogique pour tudier le principe de limplmentation dun systme dexploitation.

3.2 tapes de limplmentation


Linus Torvalds ne donne aucune indication sur limplmentation de son systme. Ltude des sources nous conduit distinguer les tapes suivantes, ce qui correspondra au plan de notre tude. Le systme dexploitation est presque entirement crit en langage C, mais il existe quelques chiers et quelques portions de chiers crits en langage dassemblage, et ceci pour deux raisons : soit pour piloter les priphriques, soit pour tenir compte des particularits du microprocesseur Intel 86386. Ces particularits sont encapsules dans des macros ou des fonctions C. La seconde partie de notre tude consiste tudier ces particularits. Dans le chapitre 4, nous voyons comment laccs la mmoire vive est encapsule dans des macros et comment la segmentation est utilise sous Linux. Ltude de la pagination est reporte au chapitre 17 sur lutilisation de la mmoire virtuelle sous Linux. Dans le chapitre 5, nous

Chapitre 3. Le systme Linux tudi 33 voyons comment laccs aux ports dentre-sortie est encapsul dans des macros et comment les interruptions, que ce soit les exceptions rserves par Intel, les interruptions matrielles ou la seule interruption logicielle de Linux sont initialises sous Linux, sans tudier, pour linstant, les gestionnaires associs. La troisime partie de notre tude est consacre aux grandes structures de donnes utilises par Linux. Dans le chapitre 6, nous tudions en dtail la structure des descripteurs de processus, la table des processus et la tche initiale, cest--dire ce qui concerne laspect statique des processus en mode noyau. Dans le chapitre 7, nous tudions la mise en place des chiers, cest--dire ce qui concerne laspect statique des chiers en mode noyau, plus exactement nous entreprenons une tude gnrale des chiers dans les divers types de systmes dexploitation, les caractristiques des chiers sous Unix, la structure dun disque Minix (qui est le seul systme de chiers accept par le noyau 0.01 de Linux), les structures de donnes lies aux chiers en mode noyau (antmmoire, nuds dinformation, super-blocs et descripteurs de chiers) et, enn, la faon dont on dsigne les chiers de priphriques sous Linux. Dans le chapitre 8, nous tudions la mise en place des terminaux haut niveau, ceci regroupant la fois lencapsulation du clavier, de lachage sur le moniteur et des deux liaisons srie. Nous nentrons pas, dans ce chapitre, dans le dtail des pilotes pour ces trois types de priphriques. La quatrime partie est consacre la mise en place de laspect dynamique du mode noyau qui ne donne pas lieu achage en cas derreur (tout simplement parce que nous navons pas vu comment celui-ci est mis en place). Dans le chapitre 9, nous voyons comment les appels systme sont mis en place, sans les tudier un par un pour linstant. Dans le chapitre 10, nous tudions la mise en place de la mesure du temps, que ce soit lhorloge temps rel ou les minuteurs. Dans le chapitre 11, nous tudions la commutation des tches et lordonnancement des processus. Dans le chapitre 12, nous tudions la notion gnrale de signal puis la mise en place des signaux sous Linux. La cinquime partie est consacre lachage. Dans le chapitre 14, nous tudions la mise en place du pilote dcran sous Linux. Dans le chapitre 15, nous tudions la mise en place de lachage format, ce qui nous conduit tudier la mise en place des fonctions de bibliothque ayant un nombre variable darguments. La sixime partie est consacre la mise en place de laspect dynamique du mode noyau faisant intervenir lachage de messages derreur. Dans le chapitre 16, nous tudions les gestionnaires des exceptions sauf celui concernant le dfaut de page, report dans le chapitre suivant. Dans le chapitre 17, nous tudions la notion de mmoire virtuelle de faon gnrale puis sa mise en place sous Linux. La septime partie est consacre ltude des chiers rguliers. 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 dur, cest--dire laccs au disque dur bas niveau. Dans le chapitre 20, nous tudions la mise en place des priphriques bloc, cest-dire laccs au disque dur haut niveau. Dans le chapitre 21, nous tudions la gestion des nuds dinformation. Dans le chapitre 22, nous tudions la gestion des chiers rguliers et des rpertoires. La huitime partie est consacre ltude des priphriques caractre. Dans le chapitre 23, nous tudions le pilote du clavier. Dans le chapitre 24, nous tudions le pilote des liaisons srie. Dans le chapitre 25, nous tudions les priphriques caractre.

34 Premire partie : Principes de conception des systmes dexploitation La neuvime partie, chapitre unique 26, est consacre ltude de la communication par tubes entre processus. La dixime partie est consacre la mise en place du mode utilisateur, cest--dire la mise en place des appels systme et des fonctions de bibliothques. Dans le chapitre 27, les appels systme concernant le systme de chiers sont mis en place. Dans le chapitre 28, les appels systme concernant les processus sont mis en place. Dans le chapitre 29, les autres appels systme sont mis en place. Dans le chapitre 30, les fonctions de la bibliothque C sont mises en place. La onzime partie, chapitre unique 31, est consacre au dmarrage du systme.

4 volution du noyau
Linux 2.2.18

Les sources du noyau 2.2.18 occupent 4 500 chiers de C et de langage dassemblage contenus dans prs de 270 sous-rpertoires ; elles totalisent quelques deux millions de lignes de code reprsentant prs de 58 Mo.

4.1 Cas du noyau 2.4.18


Linux 2.4.18

Les sources du noyau 2.4.18 occupent 122 Mo. Le premier niveau de larborescence est aussi simple que dans le cas du premier noyau : /arch concerne tout ce qui dpend de larchitecture de la puce, Linux ayant t adapt plusieurs micro-processeurs ; cest dans ce rpertoire quon retrouve ce qui a trait au dmarrage ; /Documentation contient de la documentation, en particulier sur les priphriques pris en compte ; /drivers renferme les divers pilotes de priphriques ; /fs contient ce qui concerne les systmes de chiers, plusieurs systmes de chiers tant pris en compte et non plus seulement Minix ; /include renferme les chiers den-ttes, dont beaucoup dpendent dune architecture de micro-processeur donne ; /init ne contient toujours quun seul chier main.c ; /ipc renferme la mise en place dun mode de communication entre processus qui ntait pas pris en compte lors du noyau 0.01 ; /kernel a un contenu assez proche de ce qui sy trouvait pour le noyau 0.01 ; /lib a toujours la mme fonction ; /mm galement, mais compte un peu plus de chiers ; /net concerne la mise en place des rseaux, principalement de TCP/IP, thmes non abords lors du noyau 0.01 ; /scripts renferme un certain nombre de scripts. Le contenu des rpertoires /boot et /tools est pass dans le rpertoire /arch.

Chapitre 3. Le systme Linux tudi 35

4.2 Aide au parcours du code source


Il nest pas toujours facile de sy retrouver dans le code source, en particulier pour savoir o telle constante ou telle fonction est dnie. Un bon outil est le site Internet Cross-Referencing Linux : http://lxr.linux.no/ en cliquant sur Browse the code ou, plus lent, Linux Cross Reference : http://www.iglu.org.il/lxr/

4.3 Cas du noyau 2.6.0


Donnons le premier niveau de larborescence des sources du noyau 2.6.0, qui comporte 5 929 913 lignes de code pour 212 Mo :
/Documentation ; /arch ; /crypto est un nouveau rpertoire qui concerne la cryptographie ; /drivers ; /fs ; /include ; /init ; /ipc ; /kernel ; /lib ; /mm ; /net ; /scripts ; /security est un nouveau rpertoire relatif la scurit ; /sound est un nouveau rpertoire traitant du son ; /usr est un nouveau rpertoire pour les chiers auxiliaires.
Linux 2.6.0

On y trouve donc quatre nouveaux rpertoires : deux dentre eux (sound et usr ) permettent de mieux structurer les sources ; les deux autres (crypto et security ) prennent en compte un thme trs la mode.

Conclusion
Il existe de trs nombreux systmes dexploitation. Les versions successives de chacun deux permettent dune part damliorer ce que lon peut appeler le micro-noyau du systme et, dautre part, de prendre en compte les changements essentiels dans le matriel (par exemple les rseaux ou les priphriques USB). Nous avons expliqu pourquoi il vaut mieux sintresser, dans une premire tape, au tout premier noyau, la version 0.01 de Linux, pour enchaner sur ses volutions (il en est actuellement sa version 2.6). Nous verrons dans les deux chapitres suivants en quoi un systme dexploitation dpend du micro-processeur.