# Les systèmes d'exploitation/Le démarrage de l'ordinateur

Le démarrage de l'ordinateur implique à la fois le matériel de l'ordinateur et le système d'exploitation. Sur les machines les plus simples, généralement des systèmes embarqués, le système d'exploitation est placé dans une petite mémoire ROM et est lancé automatiquement au démarrage de l'ordinateur. Mais sur les ordinateurs personnels actuels, le système d'exploitation est placé sur une mémoire de masse, comme un disque dur ou une clé USB. Le processus de démarrage est alors plus compliqué. Aucun ordinateur ne démarre directement depuis le disque dur ou une clé USB, ce qui fait qu'il y a forcément une mémoire ROM dans un ordinateur moderne. Elle sert lors du démarrage de l'ordinateur pour le configurer à l'allumage et démarrer son système d'exploitation. Cette mémoire ROM est appelée le firmware, et ce n'est autre que le BIOS sur les ordinateurs anciens, l'UEFI sur les ordinateurs récents.
Sur les ordinateurs modernes, le démarrage est un processus qui demande de nombreuses étapes, la majorité se passant avant le lancement du système d’exploitation. Le démarrage commence quand l'utilisateur appuie sur le bouton d’alimentation. Le courant passe alors dans les différents circuits de l'ordinateur, qui s'allument. Le processeur est conçu pour démarrer l’exécution d'un programme à une adresse bien précise, adresse à laquelle se trouve le firmware. Le firmware s’exécute alors et commence son travail. Il effectue beaucoup de choses, mais la première est de tester le bon fonctionnement du processeur, de la mémoire et des périphériques cruciaux. Cette étape de test est appelée le power self-on test. Si une erreur est rencontrée, le démarrage stoppe et le BIOS émet une suite de bips caractéristique. Mais si aucune erreur n'est rencontrée, le firmware poursuit le démarrage et accède alors au disque dur. Précisément, il lit le premier secteur du disque dur et lance un programme de démarrage spécialisé, appelé le bootloader, dont le but est de lancer le système d'exploitation.
    Dans ce wikilivre sur les systèmes d'exploitation, nous n'allons pas nous intéresser à ce que fait le firmware avant de lire le disque dur. Il s'agit là d'une procédure réalisée entièrement en matériel, par le firmware, qui a plus sa place dans un cours d'architecture des ordinateurs. La procédure de démarrage du BIOS est d'ailleurs abordé dans mon wikilivre "Fonctionnement d'un ordinateur", dans le chapitre sur la carte mère, accessible via ce lien : La carte mère, chipset et BIOS. Dans ce qui suit, nous partons du principe que le firmware a fait son travail de test et d'initialisation du matériel, et s’apprête à passer la main au système d'exploitation.

## Le bootloader et les partitions

Le firmware accède en premier au disque dur, avant de laisser la main au système d'exploitation. Diverses informations sont placés dans les premiers secteurs du disque dur, pour déterminer quels sont les systèmes d'exploitations installés, comment est partitionné le disque dur, comment lancer le système d'exploitation, etc. Suivant que l'on parle du BIOS ou de l'UEFI ou de leur équivalent sur les MAC et autres architectures, ces informations ne sont pas stockées de la même manière. Mais on peut quand même donner quelques généralités sur ces informations de démarrage.

### Le chargeur d’amorçage

En premier lieu, il faut parler du chargeur d'amorçage (bootloader), un morceau de logiciel qui démarre le système d'exploitation. Il le copie en mémoire, démarre le noyau et les services en espace utilisateur, et bien d'autres choses. Il existe de nombreux chargeur d'amorçage, certains sont des logiciels libres, d'autres des logiciels propriétaires. Tous les systèmes d’exploitation modernes fournissent leur propre chargeur d'amorçage. Sur les systèmes Microsoft, le chargeur d'amorçage utilisait le BIOS et correspondait à deux fichiers : le NTLDR (NT LoaDeR ou Chargeur d'amorçage de Windows NT) et un fichier de configuration boot.ini. Depuis Vista, le chargeur d'amorçage est winload.exe et sa configuration est stockée dans le registre. Apple a son propre chargeur d'amorçage appelé Bootcamp. Les chargeurs d'amorçage open Source sont eux plus nombreux, mais les plus connus sont de loin GRUB, Coreboot, et LILO/eLILO.
Il faut noter que certains bootloaders permettent de lancer plusieurs systèmes d'exploitation différents. Attention, je ne veux pas dire que l'on peut lancer plusieurs systèmes d’exploitation en même temps, comme c'est le cas avec les techniques de virtualisation. Je veux dire que l'on peut lancer au choix Windows, Linux, ou un autre OS. Il est possible d'installer plusieurs systèmes d'exploitation sur un ordinateur et de décider lequel lancer au démarrage.

### La table des partitions

Un autre point important pour le démarrage est que les partitions du disque dur sont gérées avant même le lancement du système d'exploitation. Pour rappel, partitionner un disque dur signifie le diviser en plusieurs morceaux, qui seront considérés par le système d'exploitation comme autant de disques durs séparés. Les informations sur les partitions sont mémorisées dans une table des partitions, qui stocke la taille et le premier secteur de chaque partition, ainsi que quelques informations complémentaires.

## Le démarrage sur les ordinateurs personnels de type PC

Sur les ordinateurs de type PC, au jeu d'instruction x86, il existe deux standards pour les firmware : le BIOS pour les ordinateurs anciens, et l'UEFI, pour les ordinateurs récents. Le processus de démarrage est différent pour les deux. Notamment, les informations de démarrage sur le disque dur ne sont pas organisées de la même manière. Le BIOS n'utilise que le premier secteur du disque dur, alors que l'UEFI prend plus de place. La table des partitions n'est pas la même suivant que l'on parle d'un ordinateur avec un BIOS ou utilisant l'UEFI.

### Le Master Boot Record et le BIOS

Sur les PC avec un BIOS, les informations de démarrage sont stockées dans le Master Boot Record (MBR), le premier secteur du disque dur, qui joue un rôle important lors du démarrage de l'ordinateur. Le BIOS est conçu pour lire MBR, récupérer le bootloader dans le MBR, puis lancer le noyau et le reste du système d'exploitation.
Le MBR est structuré comme illustré ci-contre, en trois grandes parties aux usages différents.
* Les premiers octets du MBR sont remplis par le bootloader. Il existe parfois une portion du code exécutable qui contient les messages d'erreur à afficher dans le cas où le lancement du système d'exploitation échouerait. Sur les BIOS récents, cette portion se termine par quelques octets de signature et d'anticopie.
* La table des partitions contient des informations sur les différentes partitions installées sur le disque dur : leur « nom », leur taille, et leur localisation sur le disque dur (adresse LBA). On ne peut créer que quatre entrées dans cette table, on se trouve donc limité à quatre partitions principales. Il faut dire que cette table ne fait que 64 octets (elle a été conçue comme cela).
* Les deux derniers octets du MBR doivent avoir une valeur bien précise pour que le BIOS autorise l'exécution. Cette valeur, appelée le nombre magique, vaut 0xAA55, ce qui correspond à 43 605 en décimal. Mais le résultat est encore plus joli en binaire : 1010 1010 0101 0101.

#### La table des partitions

Les informations de chaque partition sont codées sur 16 octets, de la manière indiquée ci-dessous. La partition correspond évidemment à un bloc de secteurs consécutifs. Vu que la taille d'une partition est codée sur 32 bits, la taille d'une partition ne peut pas dépasser les 4 Gibi-secteurs. Sur les mémoires de masse qui ont des secteurs de 512 octets, cela correspond à une capacité totale qui se rapproche de 2,2 Téraoctets par partition.
| Flag qui indique si la partition est bootable ou non | Adresse CHS du début de la partition | Type de la partition | Adresse CHS de la fin de partition | Adresse LBA du début de la partition | Taille de la partition en nombre de secteurs |
| 1 octet | 3 octets | 1 octet | 3 octets | 4 octets | 4 octets |
Afin de dépasser la limite de 4 partitions, il est possible de subdiviser une partition en sous-partitions, appelées partitions logiques. Pour cela, la partition subdivisée doit être définie comme une partition dite étendue dans le MBR (l'octet de type dans la représentation ci-dessus d'une entrée de la table de partionnement du BIOS, doit avoir une valeur bien précise). Les informations sur une partition logique sont mémorisées dans un secteur situé au début de la partition logique, dans une structure appelée Extended Boot Record. Celui-ci a une structure similaire au MBR, à quelques détails près. Premièrement, seules les deux premières entrées de la table des partitions sont censées être utilisées. La première entrée indique l'adresse de la prochaine partition logique (ce qui fait que les EBR forment une liste chaînée), tandis que la seconde entrée sert à la mémorisation des informations de la partition logique proprement dite. De plus, la place normalement réservée au bootloader est remplie de zéros.

#### Le bootloader

Le bootloader du MBR est très petit, trop petit pour contenir le moindre code substantiel. Il ne peut pas à lui seul démarrer le système d'exploitation, charger le noyau et autre. Sa réelle utilité est de charger un second bootloader, plus consistent, depuis le disque dur. On distingue ainsi le bootloader de première étape, localisé dans le MBR, et le bootloader de seconde étape situé sur le disque dur. Le premier lit la table des partitions, détecte quelles sont les partitions actives (celles bootables) et décide depuis laquelle charger le second bootloader. Le second bootloader démarre le noyau, les drivers, puis lance les logiciels en espace utilisateur. Les bootloaders de première étape les plus connus sont coreboot et Libreboot pour les logiciels open source, mais les systèmes d'exploitations usuels fournissent aussi leurs propres bootloaders. Les bootloaders de seconde étape les plus connus sont GNU GRUB, rEFInd, BOOTMGR, Syslinux, NTLDR (Windows uniquement) et iBoot (mac).

### Les tables GUID et l'UEFI

Afin de faire face aux limitations de ce système, le MBR est progressivement remplacé par des table de partitionnement GUID. Avec elle, la table des partitions peut contenir 32 partitions différentes. La table des partitions contient donc 32 entrées, une pour stocker les informations sur chaque partition. Ces entrées sont précédées par un en-tête, qui contient des informations générales permettant au système de fonctionner. Cet en-tête est lui-même précédé par un MBR tout ce qu'il y a de plus normal, pour des raisons de compatibilité.
Les adresses de chaque partition sont des adresses LBA codées sur 8 octets (64 bits), ce qui permet de gérer des partitions plus grandes qu'avec le MBR, allant jusqu’à 2,2 téraoctets. Voici à quoi ressemble une entrée de la table des partitions.
| Type de la partition | Identifiant GUID | Première adresse LBA | Dernière adresse LBA | Attributs de la partition | Nom de la partition |
| 16 octets | 16 octets | 8 octets | 8 octets | 8 octets | 72 octets |
L'UEFI utilise les tables de partition GUID pour faire son travail, mais il dispose d'un mode de compatibilité avec le MBR au cas où. Les PC avec des BIOS ne sont pas censés utiliser les partitions GUID, car cela fait partie du standard UEFI, mais quelques BIOS en sont cependant capables.