Professional Documents
Culture Documents
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.
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/
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.
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 ;
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() */
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
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). */
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.
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.
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.
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.