On aborde ici ce qui se produit lors du démarrage d’un PC de type x86_64 (BIOS classique), depuis l’appui sur le bouton d’allumage jusqu’au lancement du système Linux utilisateur.
Et il s'en passe des choses en quelques secondes
Bouton Power
↓
PSU / POWER_GOOD
↓
CPU (real mode @ 0xFFFF0)
↓
BIOS
↓
MBR (@ 0x7C00)
↓
GRUB
↓
Kernel Linux (@ 0x100000)
↓
initramfs (RAM)
↓
switch_root
↓
/sbin/init (systemd)
Tant que ce signal n’est pas présent, aucun composant logique n’exécute de code.
À la réception du signal POWER_GOOD :
La MMU (Memory Management Unit) est un composant matériel du processeur (ou très proche du processeur) qui sert à traduire les adresses mémoire et à protéger l’accès mémoire.
Concrètement, quand la MMU est active, le CPU peut fonctionner avec deux notions d’adresses :
0x7fff... en userland)La MMU permet :
Ici, au reset, la MMU est inactive, donc :
Un registre est une minuscule zone de stockage dans le CPU (beaucoup plus rapide que la RAM), utilisée pour :
Sur x86, certains registres ont des rôles historiques très précis, notamment au boot.
CS = 0xF000
IP = 0xFFF0
En real mode, l’adressage mémoire se fait via une logique de segmentation :
CS (Code Segment) indique le segment où se trouve le codeIP (Instruction Pointer) indique l’offset (position) de la prochaine instruction dans ce segmentL’adresse “physique” (réelle) est calculée ainsi :
CS de 4 bits (×16), puis on ajoute IPAutrement dit, la paire CS:IP sert à dire :
“La prochaine instruction à exécuter est située à l’adresse physique calculée à partir de ce segment + offset.”
Adresse physique calculée :
0xF0000 + 0xFFF0 = 0xFFFF0
Adresse d’exécution initiale : 0x000FFFF0
Cette adresse est câblée matériellement dans tous les CPU x86 compatibles.
C’est le seul point d’entrée possible après un reset.
À l’adresse 0xFFFF0, le CPU exécute une instruction de saut vers le code du BIOS, stocké en ROM / Flash.
Le BIOS prépare un environnement suffisamment stable pour charger le premier code disque.
Le MBR (Master Boot Record) est le tout premier secteur d’un disque bootable dans le schéma de partitionnement “classique” BIOS.
Il sert à deux choses :
Historique et contrainte importante :
Une fois un disque bootable identifié, le BIOS :
0x00007C00
0x55AASi la signature est valide, le BIOS exécute :
jmp 0x7C00
Adresse clé : 0x7C00
Toujours en real mode, sans MMU.
GRUB est un bootloader multi-étapes, conçu pour dépasser les limitations du MBR.
/boot/grubAdresse typique :
≥ 0x00100000
GRUB fournit :
GRUB charge en mémoire trois éléments indissociables.
vmlinuz)Le noyau est le composant central du système d’exploitation : c’est le programme qui tourne avec les droits les plus élevés et qui fait l’interface entre :
Il fournit notamment :
Pendant le boot, le noyau passe d’un monde très “nu” (BIOS/GRUB) à un monde structuré :
modes CPU modernes (protected/long mode)
MMU active
drivers et subsystèmes initiaux
Image du noyau compressée
Décompressée par le noyau lui-même
Adresse d’exécution standard :
0x00100000 (1 MiB)
Cette adresse est choisie pour éviter toute collision avec les zones legacy.
L’initramfs (initial RAM filesystem) est un mini système de fichiers temporaire, chargé entièrement en mémoire vive, dont le rôle est de permettre au noyau Linux de préparer l’accès au système réel.
Il constitue le pont indispensable entre le noyau et le monde utilisateur.
cpio compresséecpio
cpio(copy in / copy out) est un format d’archive Unix historique, volontairement simple.
Propriétés clés :
Le noyau Linux sait nativement :
cpioL’archive est presque toujours compressée afin de :
Formats usuels :
gzipxzlz4zstdExemples de fichiers :
initramfs.img
initrd.img
initramfs-linux.img
Le noyau détecte automatiquement le format.
Lors du chargement :
~0x00100000)[ Kernel Linux ] @ 0x00100000
[ initramfs ] @ adresse variable
L’initramfs n’est jamais monté depuis le disque.
Il est déjà en RAM au moment où le noyau commence son exécution.
Au tout début du boot, le noyau :
/L’initramfs agit comme un sas de démarrage.
Il permet notamment :
/dev, /proc, /sys/
├── init
├── bin/
├── sbin/
├── lib/
├── lib64/
├── dev/
├── proc/
├── sys/
└── etc/
/init — le cœur logiqueResponsabilités :
Un module noyau est un morceau de code “optionnel” du noyau, chargeable à la demande, qui ajoute une fonctionnalité sans devoir recompiler ou redémarrer avec un autre noyau.
Typiquement, un module fournit :
Pourquoi c’est utile au boot :
on ne peut pas tout compiler “en dur” dans le noyau
certaines fonctionnalités ne sont nécessaires que dans certains cas
l’initramfs charge juste ce dont la machine a besoin pour atteindre le vrai rootfs
pilotes disque : ahci, nvme, virtio
systèmes de fichiers : ext4, xfs, btrfs
crypto : dm-crypt
RAID / LVM : mdadm, dm-mod
Sans ces modules, le noyau ne voit pas le disque racine.
Souvent basés sur BusyBox :
mountmodprobeblkidshSuffisant pour diagnostiquer et interagir.
switch_rootLorsque le vrai rootfs est prêt :
switch_root /new_root /sbin/init
Effets :
/sbin/init devient PID 1 définitifC’est la naissance officielle du système Linux utilisateur.
Transmise par GRUB, par exemple :
root=/dev/sda1 ro quiet
Elle influence directement le comportement du noyau et de l’initramfs.
GRUB saute vers le point d’entrée du noyau.
À partir de cet instant :
Le noyau :
0x00000000 – 0x000FFFFF : BIOS / legacy
0x00100000 – : noyau Linux
/initAprès switch_root :
| Étape | Adresse |
|---|---|
| Reset CPU | 0xFFFF0 |
| MBR | 0x7C00 |
| GRUB | ≥ 0x100000 |
| Kernel Linux | 0x100000 |
| Initramfs | Après le noyau |
Le démarrage d’un PC x86_64 est une chaîne déterministe, rigoureuse et progressive.
Chaque couche prépare la suivante, sans magie, uniquement par des conventions matérielles et logicielles.
C’est cette architecture qui permet à Linux de démarrer partout, de la VM de test au serveur de production.