Le BIOS

Guy Grave

Sur les PC avec un processeur x86, il existe un programme lancé automatiquement lors du démarrage de l'ordinateur. Ce programme se charge de gérer tout ce qui a rapport au démarrage de l'ordinateur, avant de rendre la main au système d'exploitation. Autrefois, il prenait aussi en charge la gestion des périphériques : le système d'exploitation déléguait ces fonctionnalités au BIOS. Ce programme s'appelle le BIOS système, communément appelé BIOS, ce nom étant aussi utilisé pour la mémoire ROM qui le stocke. Ce BIOS se charge donc des fonctions suivantes :

- fournir un ensemble minimal de routines d'interruptions ;

- faire ce qu'il faut pour allumer l'ordinateur ;

- faire démarrer un système d'exploitation présent sur une mémoire de masse.

Commentez

- Titre : Le BIOS

- Auteur : Guy Grave

- Parution : 22 juillet 2016

- Licence : Le contenu de cet article est rédigé par Guy Grave et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de Modification 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- I. Introduction

- II. Rappels sur le mode réel des processeurs x86

- II-A. Mémoire en mode réel

- II-A-1. Mémoire conventionnelle

- II-A-2. Mémoire haute

- II-B. Mémoire étendue et HMA

- II-C. Résumé

- III. Démarrage d'un ordinateur x86

- III-A. POST

- III-A-1. Test des tensions et de l'horloge

- III-A-2. Détection des périphériques et de leur fonctionnement

- III-B. Affichage de l'interface de configuration

- III-C. On est tombé sur un OS !

- III-C-1. Structure d'un Master Boot Record

- III-C-2. Utilisation lors du Boot

- IV. Routines du BIOS

- IV-A. Routine 10h : affichage

- IV-B. Routine 13h : mémoires de masse

- IV-C. Routine 14h : port série

- IV-D. Routine 15h : fonctions système avancées

- IV-E. Routine 16h : clavier

- IV-F. Routine 19h : boot

I - Introduction

Ce cours demande des bases en architecture des ordinateurs pour être compris : la notion d'interruption est notamment un prérequis des plus importants pour ce cours. La lecture du cours Fonctionnement d'un ordinateur de zéro, du même auteur, est vivement recommandée.

Sur les PC avec un processeur x86, il existe un programme lancé automatiquement lors du démarrage de l'ordinateur. Ce programme se charge de gérer tout ce qui a rapport au démarrage de l'ordinateur, avant de rendre la main au système d'exploitation. Autrefois, il prenait aussi en charge la gestion des périphériques : le système d'exploitation déléguait ces fonctionnalités au BIOS. Ce programme s'appelle le BIOS système, communément appelé BIOS, ce nom étant aussi utilisé pour la mémoire ROM qui le stocke. Ce BIOS se charge donc des fonctions suivantes :

- fournir un ensemble minimal de routines d'interruptions ;

- faire ce qu'il faut pour allumer l'ordinateur ;

- faire démarrer un système d'exploitation présent sur une mémoire de masse.

De nos jours, on mémorise ce programme dans de la mémoire EEPROM, ce qui permet de mettre à jour le programme de démarrage : on appelle cela flasher le BIOS.

En plus du BIOS système, les cartes graphiques actuelles contiennent toutes un BIOS vidéo, une mémoire ROM ou EEPROM qui contient des routines capables d'afficher du texte et des graphismes monochromes ou 256 couleurs à l'écran. Dans les cartes graphiques compatibles avec les formats VGA/ESA, ce BIOS vidéo est localisé dans l'espace d'adressage aux adresses 000C:0000 ou 000E:0000. Lors du démarrage de l'ordinateur, ce sont ces routines qui sont utilisées pour gérer l'affichage avant que le système d'exploitation ne lance les pilotes graphiques. Ces fonctions sont extrêmement basiques, ce qui fait que les graphismes affichés à l'écran ont cet aspect si caractéristique, moche, faisant penser à l'informatique des années 1990…

Le BIOS vidéo n'est pas le seul BIOS en plus du BIOS système. Des cartes réseau peuvent avoir un BIOS, permettant de démarrer un ordinateur sur le réseau. Ces BIOS sont ce qu'on appelle des BIOS d'extension. Si le contenu des BIOS d'extension dépend fortement du périphérique en question, ce n'est pas du tout le cas du BIOS système, dont le contenu est relativement bien standardisé. C'est de ce BIOS que nous allons parler dans la suite de ce cours.

II - Rappels sur le mode réel des processeurs x86

Il faut noter que le processeur démarre systématiquement en mode réel, un mode d'exécution spécifique aux processeurs x86, où le processeur n'a accès qu'à 1 mébioctet de mémoire (les adresses font 20 bits maximum), avec un espace d'adressage segmenté et où la protection mémoire est quasi inexistante. Par la suite, le système d'exploitation basculera en mode protégé, un mode d'exécution avec protection mémoire et accès à un espace d'adressage paginé de 32 bits. Le BIOS ne peut fonctionner qu'en mode réel, ce qui fait que les systèmes d'exploitation qui s'exécutent en mode protégé doivent fournir eux-mêmes les interruptions et autres services du BIOS.

II-A - Mémoire en mode réel

Dans les grandes lignes, le premier mébioctet de mémoire est décomposé en deux portions de mémoire :

- les premiers 640 kibioctets sont ce qu'on appelle la mémoire conventionnelle ;

- les octets restants forment la mémoire haute.

II-A-1 - Mémoire conventionnelle

Les premiers 640 kibioctets de mémoire servaient à exécuter des programmes en mode réel sur certains systèmes d'exploitation. Par exemple, le MS-DOS, avant sa version 5.0, utilisait ces 640 kibioctets pour mémoriser le système d'exploitation, les pilotes de périphériques et le programme à exécuter.

Le BIOS peut aussi utiliser une portion de cette mémoire conventionnelle pour mémoriser des informations diverses et variées : cette portion de mémoire s'appelle la BIOS Data Area. Celle-ci commence à l'adresse 0040:0000h et a une taille de 255 octets. Celle-ci est initialisée lors du démarrage de l'ordinateur et est utilisée par certaines routines d'interruption du BIOS.

II-A-2 - Mémoire haute

Par contre, les octets de la mémoire haute servent pour communiquer avec les périphériques. C'est dans cette mémoire haute que divers périphériques sont mappés en mémoire. On y trouve aussi le BIOS vidéo (s'il existe). Mais même avec beaucoup de périphériques et une grosse mémoire vidéo, une bonne partie de cette mémoire restait inutilisée sur les premiers PC. En conséquence, elle était utilisable pour les programmes applicatifs, si le système d'exploitation permettait ce genre d'optimisation.

II-B - Mémoire étendue et HMA

Tout le reste de la mémoire, au-delà du premier mébioctet, est ce qu'on appelle la mémoire étendue. Il faut passer en mode protégé pour y accéder. Du moins, en théorie : quelques bogues sur les premiers processeurs Intel (le 80886, notamment) permettaient d'accéder aux 64 premiers kibioctets de cette mémoire étendue. Cette zone de 64 kibioctets était autrefois appelée la mémoire High Memory Area.

II-C - Résumé

Image créée par Bub's pour wikicommons, sous licence CC BY-SA 3.0 et GFDL 1.2

III - Démarrage d'un ordinateur x86

Au démarrage de l'ordinateur, le processeur est initialisé de manière à commencer l'exécution des instructions à partir de l'adresse 0xFFFF:0000h (l'adresse maximale en mémoire réelle moins 16 octets). C'est à cet endroit que se trouve le BIOS : les cartes mères sont conçues pour que le BIOS soit mappé en mémoire à cette adresse.

III-A - POST

Comme je l'ai dit plus haut, le BIOS sert à allumer l'ordinateur et à le configurer correctement avant de laisser la main au système d'exploitation. Cette phase s'appelle le Power On Self Test, que l'on nomme communément POST.

III-A-1 - Test des tensions et de l'horloge

Le premier élément vérifié lors du POST (Power On Self Test) est la stabilité de l'alimentation électrique de l'ordinateur. Le BIOS teste les tensions 12 V, 5 V et 3,3 V, et continue son exécution uniquement si celles-ci sont stables et à la bonne valeur. Si les tensions d'alimentation ne sont pas stables ou ne sont pas à la bonne valeur, le BIOS arrête immédiatement le démarrage, pour éviter d'endommager le processeur ou d'autres composants de l'ordinateur.

Ensuite, le BIOS vérifie la stabilité de l'horloge et de quelques autres composants : les 640 premiers kibioctets de la mémoire, par exemple.

III-A-2 - Détection des périphériques et de leur fonctionnement

Enfin, les périphériques sont détectés, testés et configurés pour garantir leur fonctionnement. Pour cela, le BIOS scanne la mémoire haute à la recherche des périphériques, tout en détectant la présence d'autres BIOS d'extension. Le BIOS est conçu pour lire la mémoire haute, par pas de 2 kibioctets. Par exemple, le BIOS regarde s'il y a un BIOS vidéo aux adresses mémoire 0x000C:0000h et 0x000E:0000h.

Pour détecter la présence d'un BIOS d'extension, le BIOS système lit ces adresses et y recherche une signature, une valeur bien précise qui indique qu'une ROM est présente à cet endroit : la valeur en question vaut 0x55AA. Cette valeur est suivie par un octet qui indique la taille de la ROM, lui-même suivi par le code du BIOS d'extension.

Si un BIOS d'extension est détecté, le BIOS système lui passe la main, grâce à un branchement vers l'adresse du code du BIOS d'extension. Ce BIOS peut alors faire ce qu'il veut : il peut modifier le vecteur d'interruption, initialiser le matériel, et ainsi de suite. Généralement, ce BIOS d'extension rend la main au BIOS avec un branchement bien placé quand il a terminé son travail.

C'est plus ou moins à ce moment qu'est initialisé le vecteur d'interruption de l'ordinateur. Il se peut que juste avant, le BIOS initialise le vecteur d'interruption au démarrage de l'ordinateur avec les adresses des routines qu'il fournit. Si le vecteur d'interruption est écrit sans erreur dans la mémoire RAM, le BIOS fait émettre un petit bip par l'ordinateur, pour signaler que tout va bien.

Par la suite, le système d'exploitation peut remplacer les adresses des interruptions par ses propres routines ou celles des pilotes : on dit qu'il détourne l'interruption. En clair, le vecteur d'interruption ne contiendra plus l'adresse servant à localiser la routine du BIOS, mais celle localisant la routine de l'OS. De fait, les routines du BIOS ne servent à rien avec les systèmes d'exploitation modernes.

Si tout fonctionne bien, le BIOS va alors demander l'affichage d'un message à l'écran. Si un problème a lieu durant cette phase de test, le BIOS émet un signal sonore.

Il faut signaler qu'un buzzer est placé sur la carte mère et est directement commandable par le BIOS : au moindre problème à l'allumage, le BIOS le fait biper. Suivant l'erreur, la série de bips émise sera différente, afin de pouvoir identifier l'erreur facilement. Attention, cependant : les séries de bips n'ont pas été standardisées par les fabricants de BIOS.

III-B - Affichage de l'interface de configuration

À ce stade du démarrage, une interface graphique s'affiche. La majorité des cartes mères permettent d'accéder à une interface pour configurer le BIOS, en appuyant sur F1 ou une autre touche lors du démarrage. Cette interface donne accès à plusieurs options modifiables, qui permettent de configurer le matériel.

Capture d'écran de l'interface d'un BIOS - Image du domaine public - Wikicommons

Ces paramètres sont stockés dans une mémoire flash ou EEPROM séparée du BIOS, qui est lue par le BIOS à l'allumage de l'ordinateur. Cette mémoire, la mémoire CMOS, est adressable via les adresses 0x0007:0000 et 0x0007:0001 (ces adresses sont écrites en hexadécimal).

III-C - On est tombé sur un OS !

Dans tous les PC actuels, le système d'exploitation est placé sur le disque dur. Le BIOS doit alors charger le système d'exploitation dans la mémoire RAM. Pour cela, il doit utiliser des informations mémorisées dans le Master Boot Record, le premier secteur du disque dur.

III-C-1 - Structure d'un Master Boot Record

Un MBR est assez bien organisé et contient trois grandes parties aux usages différents :

- le code exécutable du boot loader, avec éventuellement des messages d'erreurs ;

- la table des partitions ;

- une valeur magique.

Les premiers octets du MBR sont remplis par un programme servant à charger le système d'exploitation. 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. Par exemple, le message d'erreur NTDLR manquant est stocké dans cette zone. 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. Chaque ligne d'une table de partition contient l'adresse CHS de début d'une partition et sa taille. On ne peut créer que quatre lignes 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 : 1010101001010101. Il faut remarquer que la valeur sur le disque dur est en réalité 55AA, à cause du boutisme (l'endianness, diraient les Anglo-saxons).

Master Boot Record traditionnel

III-C-2 - Utilisation lors du Boot

Lors du démarrage, le MBR est copié dans la RAM (à l'adresse 0x7C00) à la fin du POST. Si le nombre magique est bien présent, la routine effectue un branchement vers l'adresse de base de ce code en mémoire (notre fameux 0x7C00), ce qui permet d'exécuter ce programme et donc de lancer l'OS.

IV - Routines du BIOS

Le BIOS fournit des routines d'interruption pour gérer les périphériques et matériels les plus courants. Ce n'est pas pour rien que « BIOS » est l'abréviation de Basic Input Output System, ce qui signifie « programme basique d'entrée-sortie ». Ces routines sont standardisées de façon à assurer la compatibilité des programmes sur tous les BIOS existants.

Ces routines peuvent effectuer des traitements parfois très complexes, comme communiquer avec des périphériques. Certaines routines peuvent notamment effectuer plusieurs traitements : par exemple, la routine qui permet de communiquer avec le disque dur peut aussi bien lire un secteur, l'écrire, etc. Pour spécifier le traitement à effectuer, on doit placer une certaine valeur dans le registre AH du processeur : la routine est programmée pour déduire le traitement à effectuer uniquement à partir de la valeur du registre AH.

Mais certaines routines ne font pas grand-chose : par exemple, l'interruption 0x12h ne fait que lire une portion de la BIOS Data Area pour y récupérer la taille de la mémoire conventionnelle. De manière générale, beaucoup d'interruptions lisent ou écrivent dans la BIOS Data Area, même si ce n'est pas une obligation.

Les routines du BIOS étaient parfois recopiées dans la mémoire RAM afin de rendre leur exécution plus rapide. Certaines options du BIOS, souvent nommées BIOS memory shadowing, permettent justement d'autoriser ou d'interdire cette copie du BIOS dans la RAM.

Mais une fois le système d'exploitation démarré, ces fonctions de base ne servent plus. Le vecteur d'interruption est mis à jour après le démarrage pour qu'il pointe non pas vers les interruptions du BIOS, mais vers les interruptions fournies par le système d'exploitation et les pilotes. Cette mise à jour est effectuée par le système d'exploitation, une fois que le BIOS lui a laissé les commandes.

IV-A - Routine 10h : affichage

Si aucune ROM vidéo n'est détectée, le BIOS peut quand même communiquer directement avec la carte graphique grâce à une routine qu'il possède. Cette routine a plusieurs fonctions différentes et peut tout aussi bien envoyer un caractère à l'écran que renvoyer la position du curseur.

IV-B - Routine 13h : mémoires de masse

Une routine du BIOS permet de lire ou d'écrire sur le disque dur ou sur une disquette : c'est la routine 13h. Cette routine lui sert à lire les premiers octets d'un disque dur afin de pouvoir charger le système d'exploitation. Elle était aussi utilisée par les systèmes d'exploitation du style MS-DOS pour lire ou écrire sur le disque dur.

IV-C - Routine 14h : port série

La routine 14h était utilisée pour communiquer avec le port série RS232 de notre ordinateur.

IV-D - Routine 15h : fonctions système avancées

La routine 15h a des fonctions diverses et variées, toutes plus ou moins rattachées à la gestion du matériel. Le BIOS était autrefois en charge de la gestion de l'alimentation de notre ordinateur : il se chargeait de la mise en veille, de réduire la fréquence du processeur, d'éteindre les périphériques inutilisés. Pour cela, la routine 15h était utilisée. Ses fonctions de gestion de l'énergie étaient encore utilisées jusqu'à la création de Windows 95. De nos jours, avec l'arrivée de la norme ACPI, le système d'exploitation gère tout seul la gestion de l'énergie de notre ordinateur et cette routine est donc obsolète.

À toute règle, il faut une exception : cette routine est utilisée par certains systèmes d'exploitation modernes à leur démarrage afin d'obtenir une description correcte et précise de l'organisation de la mémoire de l'ordinateur.

IV-E - Routine 16h : clavier

La routine 16h permet de gérer une partie du clavier, et souvent de le configurer. Cette routine est utilisée tant que le système d'exploitation n'a pas démarré, c'est pour cela que vous pouvez utiliser le clavier pour naviguer dans l'écran de configuration de votre BIOS.

En revanche, aucune routine standard ne permet la communication avec la souris : il est impossible d'utiliser la souris dans la plupart des BIOS. Certains BIOS possèdent malgré tout des routines capables de gérer la souris, mais ils sont très rares.

IV-F - Routine 19h : boot

Cette routine est celle qui copie le MBR dans la RAM, de vérifier la présence de la valeur magique et d'exécuter le bootloader si tout va bien. Elle sert donc à lancer le système d'exploitation lors du démarrage d'un ordinateur, mais elle sert aussi en cas de redémarrage : on peut redémarrer l'ordinateur en appelant la routine 19h, à condition d'avoir pris quelques précautions (désactiver les interruptions matérielles, notamment).

Vous remarquerez que je n'ai pas vraiment détaillé ce que font ces interruptions, ni comment les utiliser. Il faut dire que de nos jours, ce n'est pas franchement utile. Mais si vous voulez en savoir plus, je vous invite à lire la liste des interruptions du BIOS de Ralf Brown, disponible via ce lien : Liste des interruptions du BIOS, établie par Ralf Brown.