Au démarrage d'un PC, le programme de chargement situé dans le BIOS du système (stocké en ROM) est exécuté, son rôle est de charger le programme de chargement du MBR.
Il existe plusieurs programmes de chargement, citons lilo, le FreeBSD boot loader, grub ... Ces programmes peuvent démarrer tous les systèmes d'exploitation (OS) fonctionnant sur un PC. dans le cas le plus simple le chargeur lance l'OS de la partition marquée comme active. A l'extrême (plusieurs OS différents), le chargeur laisse à l'opérateur le soin de choisir le système qu'il veut lancer, puis charge le secteur de boot de l'OS choisi qui à son tour lance l'OS.
Le processus typique de bootstrapping (démarrage de l'OS) est décomposable en six étapes :
Le chargement et l'initialisation du noyau.
La détection et la configuration des périphériques.
La création de processus système « spontanés ».
L'intervention éventuelle de l'opérateur système (en mode manuel).
L'exécution des scripts de démarrage.
Les opérations en mode multi-utilisateurs.
Le noyau est un fichier stocké sur disque et l'une des première tâches du processus de démarrage est de le charger en mémoire.
GNU/Linux procède en deux temps :
Dans la première étape, la ROM charge en mémoire centrale (RAM) un petit programme localisé sur disque.
Dans la seconde, ce petit programme se charge de trouver et charger le noyau.
Le noyau détermine la quantité de RAM disponible, notamment pour ses structures internes dont certaines ont une taille statiquement fixée. Une certaine portion de cette mémoire est alors exclusivement réservée au noyau et ce dernier affiche sur la console le total de la mémoire trouvée et le total disponible pour les processus utilisateurs.
Du point de vue conceptuel le noyau est une couche qui s'interface avec le matériel. La détection et la configuration des périphériques (matériels) disponibles est donc une tâche importante. Configurer son noyau c'est définir la configuration matérielle dans laquelle il s'exécutera.
Le noyau tente donc de localiser cette configuration attendue et recherche des informations supplémentaires en interrogeant directement les périphériques. Il imprime sur la console (et conserve) des informations quant à ces investigations.
A noter qu'il est très souvent possible d'activer dynamiquement un nouveau périphérique non prévu dans la configuration originale.
A ce stade le noyau va créer un certain nombre de processus qualifiés de spontanés, dans la mesure où il ne résulte pas du mécanisme standard de fork.
Le nombre et la nature de ces processus varient d'un système à l'autre. Avec GNU/Linux, il n'y a pas de processus visible de pid 0, le premier processus de pid 1 (i.e. INIT père de tous les processus utilisateurs subséquents) est accompagné d'un certain nombre de processus spontanés gérant le noyau (kflushd, ...), la mémoire (kswapd, ... ), les E/S (kiod, ...), la journalisation (kjournald pour ext3).
Sous BSD 4.4 (le père des flavors xBSD, tous les processus sont les héritiers d'un processus unique crée au démarrage du système. Ce processus ancêtre génère trois processus spontanés [1] qui existe toujours tant que le système est démarré :
Le processus noyau swapper de
pid 0responsable du transfert entre la mémoire principale (RAM) et la mémoire secondaire (SWAP) des processus quand l'espace en mémoire principale est saturé.Le processus noyau pagedaemon de
pid 2responsable de l'écriture de parties de l'espace d'adresse (pages) d'un processus vers la mémoire secondaire dans le contexte de gestion de la mémoire virtuelle.Le processus utilisateur init de
pid 1, premier processus à s'exécuter dans l'espace utilisateur (i.e. hors noyau) et ancêtre de tous les autres processus utilisateurs.
Lorsque ces processus « spontanés » ont été créés, l'étape de bootstrapping est terminée, néanmoins à ce stade la plupart des démons (processus systèmes) ne sont pas encore lancés, impossible par exemple de se connecter. La suite des opérations est prise en charge par le processus init.
Si le système boote en mode single user, suite à l'activation d'un paramètre au démarrage, le noyau en avertit le processus init. Selon les systèmes, init peut éventuellement activer un sous-processus chargé de demander le mot de passe du super-utilisateur, puis si l'identification est réussie, init crée un shell de connexion.
Selon les systèmes (notamment Debian GNU/Linux, FreeBSD) seule la partition racine est montée en lecture seule. On exécute d'abord manuellement un fsck sur toutes les partitions, puis on remonte en écriture la partition racine, avant de remonter toutes les partitions restantes. Ensuite on exécute éventuellement les tâches qui ont requis ce mode.
Lorsque le travail est terminé, on met fin à ce mode pour soit passer directement en mode multi-utilisateur (séquence <CTRL>-D, sous FreeBSD) soit redémarrer/arrêter le système (commande shutdown).
Il s'agit de scripts shell choisis et exécutés par le processus init. Nous étudions cela dans une partie ultérieure (c.f. section Section 4.4, « Scripts de démarrage Debian »).
Après l'exécution des scripts de démarrage le système est quasi-fonctionnel, il ne manque que la possibilité de se logger. Chaque terminal (y compris la console) qui permet de se logger est contrôlé par un processus getty lancé par le processus init, ce dernier étant aussi responsable du lancement du gestionnaire de connexion en mode graphique (xdm ou wdm ou gdm...).
A l'issue de cette phase le système est complètement opérationnel et le processus init continue de jouer un rôle important (rappelons par exemple qu'il hérite des processus orphelins, qu'il gère le processus d'arrêt, reboot et passage en mode mono-utilisateur, ...).
[1] Les flavors BSD héritière de la branche 4.4 génère d'autres processus [en fait des kernel threads] ] (wmdaemon, bufdaemon, wnlru ... sous FreeBSD, par exemple).