Présentation
Bienvenue dans la première partie d'une série
d'articles sur les secrets du noyau. Vous avez probablement
déjà jeté un coup d'oeil dans les sources du
noyau par le passé. Dans ce cas vous avez noté que les
100ko de fichiers compressés du noyau initial sont devenus au
fil du temps 300 fichiers totalisants plus de deux millions de lignes
de source, et occupant plus de 9Mo sur le disque une fois
compressés.
Cette série n'est pas destinée aux nouveaux venus mais
au programmeurs ayant déjà une certaine
expérience. Vous êtes néanmoins libre de la lire
et l'auteur répondra de son mieux au questions que vous
pourriez lui envoyer par e-mail.
On découvre tous les jours des nouveaux bugs, et des correctifs
apparaissent au même rythme. Aujourd'hui il est presque
impossible de comprendre le code source dans son ensemble. Il est
écrit par de très nombreuses personnes qui essayent de
garder un style de programmation homogène, mais il est en fait
différent pour chaque personne.
LINUX: Le système
d'exploitation de l'internet
Linux est un système d'exploitation gratuit et libre,
disponible pour des architectures P.C. ainsi que pour d'autres
plates-formes. Il est compatible avec le standard POSIX 1003.1 et il
inclus un bon nombre des fonctionnalités d'Unix System V et BSD
4.3. Le coeur du noyau Linux dont parle cette série d'article a
été écrit par Linus Torvalds un étudiant
en informatique finlandais. La première version du noyau a vu
le jour en Novembre 1991.
Principales caractéristiques
Linux réponds à tous les besoins d'un système
d'exploitation basé sur UNIX:
- Multitâche
Linux est un vrai système
multitâche. Toutes les taches sont indépendantes. Aucune
ne doit "relâcher" le processeur pour qu'une autre
puisse s'exécuter.
- Multiutilisateur
Linux n'est pas seulement un
système multiutilisateur, il est capable de partager les
ressources de l'ordinateur entre divers utilisateurs connectés
à travers différents terminaux.
- Exécutables chargés à la demande
Seules les portions nécessaires d'un programme sont
chargées en mémoire.
- Mémoire virtuelle
Si la mémoire est
pleine, le noyau va alors chercher des pages de 4ko (8ko sur un ALPHA)
non-employées pour les écrire sur le disque. Si une de
ces pages doit être réutilisée le noyau la remets
à sa place originale. Dans Les vieux systèmes UNIX et
quelques plates-formes actuelles dont Microsoft Windows la
mémoire est swappé sur le disque. Cela signifie que
toutes les pages mémoire d'une tache sont sauvées sur le
disque quand il y a un manque de RAM, c'est moins efficace.
- Cache disque dynamique
Les utilisateurs de MS-DOS
utilisent SmartDrive, un programme qui réserve une
quantité fixe de RAM pour faire du cache disque. Linux au
contraire a un système de cache dynamique, la taille de
mémoire pour le cache grossit quand la RAM est
inutilisée, elle s'amoindrie quand le système ou les
utilisateurs demandent plus de RAM.
- Librairies partagées
Les librairies sont des
collections de routines utilisées par les programmes pour
traiter les données. Il y a plus d'une tache qui utilisent la
même librairie au même momment. Ces librairies
étaient incluses dans chaque programme dans les anciens
systèmes, et donc chargées plusieurs fois en
mémoire quand des programmes étaient
exécutés, ce qui occupait inutilement de la place en
mémoire. Dans les systèmes modernes comme Linux, les
librairies ne sont chargées qu'une fois en mémoire et
partagées entre les programmes qui en ont besoin.
- 100% compatible avec le standard POSIX 1003.1
Le
standard POSIX 1003.1 définit une interface standard de
programmation pour les système d'exploitation UNIX. Cette
interface est décrite comme un jeu de routine C, et elle est
compatible avec tous les systèmes d'exploitation
modernes. Microsoft Windows NT reconnait POSIX 1003.1. Linux 1.2 est
100% compatible avex POSIX, de plus des interfaces SYSTEM V et BSD
sont implémentées.
- Plusieurs formats d'exécutables
Qui n'aimerait
pas lancer des applications DOS,Windows ou FreeBSD sous Linux ? Des
émulateurs DOS, Windows, et Windows95 sont en
dévelopement. Linux est aussi capable d'exécuter les
binaires d'autres plateformes UNIX sur architecture Intel compatibles
avec le standard iBCS2 (intel Binary Compatibility) comme SCO par
exemple.
- Plusieurs systèmes de fichier
Linux est
compatible avec un grand nombre de systèmes de fichier. Le
système le plus utilisé aujourd'hui est le "Second
Extended File System" (ext2). Un autre systèmre de fichier
reconnu est le "File Allocation Table" utilisé par
MS-DOS, mais la FAT n'est pas utilisable dans un système UNIX
pour des raisons de sécurité ou d'accés
multiutilisateur à cause de sa conception.
- Réseau
Linux peut être
intégré dans n'importe quel réseau local. Tous
les services UNIX sont disponibles (NFS, telnet, rlogin, SLIP, PPP,
etc..). L'intégration comme serveur ou client d'autres
réseaux est aussi possible par exemple pour le partage de
fichier et d'imprimante sous Macintosh, Netware et Windows.
- SYSTEM V IPC
Linux utilise cette technologie pour
implementer les queues de message inter-process, les
sémaphores, et les zones mémoire partagées.
Compiler le noyau
Structure des sources:Les sources du noyau se
trouvent généralement sous le répertoire
/usr/src/linux, nous mentioneront les répertoires
relativement à ce point. En résultat du portage sur
d'autres architectures qu'INTEL la structure des fichiers du noyau a
été changée aprés la version 1.0. Le code
dépendant de l'architecture se trouve sous le répertoire
arch/. Le code pour les Intel 386, 486, Pentium, et Pentium
Pro se trouve sous le répertoire arch/i386/. Le
répertoire arch/mips/ est pour les systèmes
basés sur les processeurs MIPS, arch/sparc/ est pour
les SUN Sparc, arch/ppc/ pour les PowerPC/PowerMacintosh,
ect... Nous nous concentrerons sur l'architecture Intel car c'est sur
cette plateforme que Linux est le plus employé.
Le noyau Linux est comme un programme C ordinaire. Il y a seulement
deux différences importantes. Le point de départ des
programmes écrits en C est la fonction main(int argc,char
**argv). Le noyau Linux utilise
start_noyau(void). L'environnement du programme n'existe pas
quand l' ordinateur vient de démarrer et que le noyau n'est pas
encore chargé. Cela signifie que quelques petites choses
doivent être faites avant que la première routine C ne
soit appelée. Le code assembleur qui se charge de ça est
situé sous le répertoire arch/i386/asm/.
Une routine assembleur charge le noyau à l'adresse 0x100000
(1 Mo), puis installe la routine de gestion des interuptions, la table
globale de description de fichier et la table de description des
interruptions qui ne seront utilisées que pendant la
durée de l'initialisation. A ce momment, le processeur passe en
mode protégé. Le répertoire init/
contient tout ce dont on a besoin pour initialiser le noyau. De
là la routine start_kernel() initialise le noyau
proprement en prenant en considération les paramètres
passés au boot. La première tache est alors crée
sans utilisé les appels du système (le système
lui même n'est pas encore chargé). C'est la fameuse tache
idle, celle qui utilise le temps processeur quand il n'est pas
utilisé par une autre tache.
Les répertoires kernel/ et
arch/i386/kernel/ contiennent comme le suggère leur
nom les parties principales du noyau. C'est l'endroit où les
principaux appel système sont implémentés. Mais
il y a aussi le controlleur de temps (time handler), l'ordonnanceur
(scheduler), le gestionnaire DMA, le controller d'interruption, et le
controlleur de signaux.
Le code destiné à la gestion mémoire se trouve
dans mm/ et arch/mm/. Cet espace est en charge de la
gestion de l'allocation et de la désallocation de la
mémoire ainsi que de la pagination.
Le sytème de fichier virtuel et sous le répertoire
fs/. Les différents système de fichier reconnus
se trouvent dans des sous répertoires. Les plus importants sont
ext2 et proc. Nous les détaillerons plus tard.
Tous les système d'exploitation on besoin de pilotes
matériel, dans le noyau Linux ils se trouvent sous le
répertoire drivers/.
Sous ipc/ vous trouverez l'implémentation des
appels SYSTEM V IPC.
Le code source qui implémente les protocoles réseaux,
les sockets se trouve sous le répertoire net/.
L'implémentation de quelques routines C se trouvent dans
lib/, permettant au noyau d'utiliser certaines fonctions
C.
Les modules chargeable générés lors de la
compilation du noyau sont dans le répertoire modules/,
mais il est vide avant que la première compilation du noyau ne
soit faite.
Le répertoire probablement le plus important pour les
programmeurs est include/. Ici vous trouverez tous les
fichiers d'entête C spécifiquement utilisé par le
noyau. Les fichiers d'entête concernant la seule plateforme
Intel se trouvent dans le répertoire include/asm-386/.
Compiler:Un nouveau noyau est
généré en seulement 3 étapes:
- Premièrement il faut configurer le noyau avec "make
config", "make menuconfig" ou "make xconfig"
(différentes interfaces pour la même étape de
configuration)
- puis les dépendance sont calculées avec "make
depend"
- enfin la compilation est réalisée avec "make"
Dans les prochains articles nous rentrerons dans les détails
de ces scripts et comment les modifier pour ajouter de nouvelles
configurations.
J'espère que vous avez apprécié cette article. Vous étes invité à envoyer
vos commentaires, sugestions, et critiques à [email protected]
|