Chaîne de démarrage d'un PC x86_64
Technologie

Du bouton Power au noyau : ce qui se passe vraiment au démarrage d'un PC

POWER_GOOD, reset du processeur à une adresse câblée dans le silicium, BIOS, MBR de 512 octets, GRUB en deux étages, noyau à 1 Mio : la chaîne de démarrage x86_64, étape par étape et adresse par adresse.

Entre l'appui sur le bouton et l'invite de connexion, il s'écoule quelques secondes pendant lesquelles une machine passe d'un état où rien n'exécute de code à un système d'exploitation complet. Ce trajet n'a rien de magique : c'est une chaîne déterministe où chaque couche ne fait qu'une chose — préparer la suivante.

La chaîne de démarrage complète d'un PC x86_64

De l'alimentation au premier processus : chaque étape a son adresse mémoire et son rôle précis.

Avant tout : l'électricité

Le bouton d'allumage ne démarre pas le processeur. Il envoie un signal à l'alimentation, qui stabilise ses tensions — 3,3 V, 5 V, 12 V — puis émet vers la carte mère un signal nommé POWER_GOOD. Tant que ce signal est absent, aucun composant logique n'exécute la moindre instruction. C'est une garantie matérielle : personne ne veut d'un processeur qui démarre avec une tension instable.

Le reset du processeur : une adresse câblée

À réception du signal, le processeur sort de son état de reset et démarre en real mode — l'héritage du 8086 : bus 16 bits, un mégaoctet adressable, et surtout MMU inactive.

La MMU (Memory Management Unit) est le composant qui traduit les adresses virtuelles vues par les programmes en adresses physiques, et qui interdit à un programme d'écrire n'importe où. Au démarrage, elle est désactivée : les adresses manipulées sont directes, le comportement est simple et prévisible.

Deux registres sont imposés par l'architecture — CS = 0xF000 et IP = 0xFFF0. En real mode, l'adresse physique se calcule en décalant le segment de quatre bits et en ajoutant l'offset :

0xF000 × 16 + 0xFFF0 = 0xFFFF0

Cette adresse est câblée dans le silicium de tous les processeurs x86 compatibles. C'est l'unique point d'entrée possible après un reset — et c'est là que se trouve le premier saut vers le BIOS.

Le BIOS : rendre la machine utilisable

Le code du BIOS, stocké en mémoire morte, effectue le travail que personne d'autre ne peut faire à ce stade : initialisation minimale du processeur, détection et cartographie de la mémoire, initialisation du clavier, de la vidéo et des bus, exécution du POST (l'autotest de démarrage), puis recherche d'un périphérique amorçable selon l'ordre configuré.

Son rôle se résume à une phrase : rendre la plateforme suffisamment stable pour charger le premier code venu du disque.

Le MBR : 512 octets, pas un de plus

Le Master Boot Record est le tout premier secteur du disque. Sa taille est fixée à 512 octets, répartis ainsi :

  • 446 octets de code d'amorçage ;
  • 64 octets de table de partitions ;
  • 2 octets de signature — 0x55AA.

Le BIOS lit ce secteur, le charge à l'adresse 0x7C00 — autre convention historique — vérifie la signature, puis saute dedans. Avec 446 octets, on ne fait pas grand-chose : le seul rôle réaliste de ce code est de charger un chargeur plus évolué.

GRUB : franchir les limites

GRUB est un chargeur multi-étages, précisément pour contourner l'étroitesse du MBR.

  • Étage 1 — logé dans le MBR, minuscule, il ne sait faire qu'une chose : charger l'étage suivant ;
  • Étage 2 — chargé depuis /boot/grub, il active la ligne A20 (qui débloque l'accès au-delà du mégaoctet), passe en protected mode, accède à toute la mémoire et — point décisif — sait lire les systèmes de fichiers (ext4, FAT, XFS…).

C'est cette dernière capacité qui rend possible le menu de démarrage, le choix du noyau et le passage de paramètres.

Le noyau, l'initramfs et la ligne de commande

GRUB charge alors trois choses indissociables : l'image compressée du noyau (vmlinuz), l'initramfs, et la ligne de commande du noyau — par exemple root=/dev/sda1 ro quiet.

Le noyau est chargé à 0x100000, soit un mégaoctet pile : une adresse choisie pour éviter toute collision avec les zones historiques du premier mégaoctet. Il se décompresse lui-même, passe du protected mode au long mode 64 bits, active la MMU et met en place les tables de pages.

À cet instant, BIOS et GRUB sont définitivement sortis du chemin d'exécution : plus personne ne les rappellera.

La carte mémoire, en quatre lignes

0xFFFF0                  point d'entrée après reset du CPU
0x7C00                   MBR chargé par le BIOS
≥ 0x100000               GRUB étage 2
0x100000 (1 Mio)         noyau Linux
après le noyau           initramfs

Et ensuite ?

Le noyau est en mémoire, la MMU tourne — mais il ne sait pas encore lire votre disque : NVMe, RAID, LVM, chiffrement… c'est le rôle de l'initramfs, et le sujet de l'article suivant. Une fois le vrai système de fichiers racine monté, un switch_root passe la main à /sbin/init — systemd, le plus souvent — qui devient PID 1 définitif et démarre les services.

Rien, dans toute cette chaîne, ne relève de la magie : uniquement des conventions matérielles et logicielles, empilées avec une régularité qui explique que Linux démarre aussi bien sur une machine virtuelle de test que sur un serveur de production.

La page de référence est sur le wiki

Cet article ne remplace pas la documentation : il en reprend le fil et en explique les raisons. Le détail complet — toutes les commandes, tous les scripts, les options de configuration une par une — est publié sur mon wiki :

La série

Deux articles pour comprendre ce qui se passe au démarrage, trois pour fabriquer un système Linux complet à la main :

  1. Du bouton Power au noyau : la chaîne de démarrage x86 — vous y êtes
  2. initramfs et switch_root : le sas de démarrage
  3. Fabriquer son Linux (1) : noyau et BusyBox
  4. Fabriquer son Linux (2) : disque, rootfs et PID 1
  5. Fabriquer son Linux (3) : initramfs, GRUB et premier boot
Retour au blog