Le BIOS : qu'est-ce que c'est ?

Guy Grave

Vous avez sûrement déjà entendu parler du BIOS et on vous a sûrement dit que c'était quelque chose qui servait au démarrage de votre ordinateur ? Eh bien, il est maintenant temps de passer aux choses sérieuses : ce tutoriel va vous expliquer et détailler un peu plus le rôle du BIOS dans un ordinateur et son fonctionnement.

Votre avis et vos suggestions sur cet article m'intéressent !
Alors après votre lecture, n'hésitez pas : Commentez

- Titre : Le BIOS : qu'est-ce que c'est ?

- Auteur : Guy Grave

- Parution : 8 janvier 2014

- 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 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. Un peu d'archéologie informatique

- II-A. Rappel sur les interruptions

- II-A-1. Vecteur d'interruption

- II-B. Routines d'interruption du BIOS

- II-B-1. INT 10h : affichage

- II-B-2. INT 11h

- II-B-3. INT 12h

- II-B-4. INT 13h : mémoires de masse

- II-B-5. INT 14h : port série

- II-B-6. INT 15h : fonctions système avancées

- II-B-7. INT 16h : clavier

- II-B-8. INT 17h : port parallèle

- II-B-9. INT 19h

- II-C. Conclusion

- III. Démarrage d'un ordinateur x86

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

- III-B. Rappels sur le disque dur

- III-B-1. Secteurs, cylindres et têtes

- III-B-2. Adressage CHS

- III-C. MBR

- III-C-1. Code exécutable

- III-C-2. Table des partitions

- III-C-3. Messages d'erreur

- IV. CMOS RAM et autres

- IV-A. CMOS RAM

- IV-B. Autres paramètres du BIOS

- V. Conclusion

I - Introduction

Vous savez sûrement que dans un ordinateur, il y a plusieurs composants (processeur, mémoire RAM…). Ces composants sont tous installés sur une carte électronique qui est chargée de les faire communiquer entre eux et qu'on appelle la carte mère. Parmi tous ces composants indispensables, chaque ordinateur contient au moins une mémoire ROM sur laquelle se trouve un programme (un ordinateur sans programme serait vraiment inutile) : le BIOS.

Il s'agit d'un petit programme qui se lance au démarrage de l'ordinateur et dont le rôle est de :

- s'occuper de la gestion de certains périphériques ;

- 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.

Autrefois, le BIOS était stocké dans une mémoire ROM placée sur la carte mère. De nos jours, on préfère utiliser de la mémoire EEPROM (souvent de la flash) pour stocker celui-ci. On peut ainsi remplacer le programme contenu dans la mémoire EEPROM du BIOS par un autre : on appelle cela flasher le BIOS.

II - Un peu d'archéologie informatique

Notre BIOS a comme première fonction de prendre en charge une partie de la gestion du matériel et de fournir quelques abstractions matérielles minimales au système d'exploitation et à l'utilisateur. Pour simplifier le travail, on a incorporé de petits programmes dans notre BIOS dont le rôle était de gérer une partie du matériel présent sur la carte mère. Ces programmes ont été standardisés de façon à assurer la compatibilité des programmes utilisant ces routines sur tous les BIOS existants. Ce n'est pas pour rien que « BIOS » est l'abréviation de Basic Input Output Software, ce qui signifie « programme basique d'entrée / sortie ».

II-A - Rappel sur les interruptions

Pour communiquer avec le matériel, le BIOS utilise des fonctionnalités de notre processeur qu'on appelle les interruptions.

Oh là, c'est quoi, une interruption ?

C'est une fonctionnalité de notre processeur qui permet d'arrêter temporairement l'exécution d'un programme pour en exécuter un autre. On utilise les interruptions dans quelques cas bien précis, qui nécessitent un traitement ne pouvant attendre trop longtemps : communiquer avec un ou des périphériques, par exemple. Ainsi, pour communiquer avec une carte graphique, un disque dur ou un clavier, notre BIOS devra utiliser des interruptions.

Celles-ci ont pour but d'interrompre l'exécution d'un programme afin de réagir à un événement extérieur (matériel, erreur fatale d'exécution d'un programme…) et de le traiter en temps voulu, avant de rendre la main au programme interrompu. Notre interruption va donc effectuer un petit traitement (ici, communiquer avec un périphérique). Ce traitement est effectué par un petit programme auquel on a donné un nom technique : routine d'interruption.

Lorsqu'un processeur doit exécuter une interruption, celui-ci :

- arrête l'exécution du programme en cours ;

- exécute la routine d'interruption ;

- reprend l'exécution du programme suspendu là où elle en était.

Il existe trois moyens pour déclencher une interruption :

- une instruction un peu spéciale du processeur ;

- les exceptions, qui se produisent automatiquement lorsque le processeur rencontre une erreur (par exemple une division par zéro) ;

- les requêtes d'interruption, qui sont déclenchées par un événement d'origine matérielle.

Comme vous le voyez, les interruptions peuvent non seulement être appelées par un programme quelconque, grâce à l'instruction int, mais elles permettent aussi de réagir à des événements purement matériels, comme l'appui d'une touche au clavier.

Comme on l'a dit, une interruption a été conçue pour réagir à un événement, mais c'est avant tout un programme, qui peut être exécuté comme n'importe quel autre programme. Dans notre cas, ces interruptions seront simplement considérées comme des programmes simplistes permettant d'agir sur un périphérique. Bien sûr, devant la multiplicité des périphériques, on se doute bien qu'il n'existe pas d'interruption à tout faire : il va de soi qu'un programme envoyant un ordre au disque dur sera différent d'un programme agissant sur une carte graphique. Dans chaque cas, on aura besoin d'effectuer un traitement différent, on doit donc disposer de plusieurs routines d'interruption. Pour le cas de notre BIOS, celui-ci fournit beaucoup de routines de base pour communiquer avec les périphériques de notre ordinateur.

II-A-1 - Vecteur d'interruption

Cependant, il faut bien décider quelle est l'interruption à exécuter suivant la situation. Par exemple, exécuter l'interruption de gestion du clavier alors qu'on souhaite communiquer avec notre disque dur produirait un résultat plutôt comique. Par conséquent, on doit stocker plusieurs de ces routines dans sa mémoire. Mais comment les retrouver ? Comme les autres données ! Pour expliquer correctement cela, il va falloir faire un petit rappel.

La mémoire de notre ordinateur est un vulgaire amas de cellules mémoire, chacune capable de retenir des bits ; on rappelle qu'un bit est une information qui peut prendre deux valeurs : 0 ou 1. Ces cellules sont regroupées en paquets de 8, qu'on appelle des cases mémoire. Ces cases contiennent donc des données (ou des morceaux de données : un nombre entier occupe souvent plusieurs cases). Pour savoir dans quelle case mémoire on a stocké notre donnée, notre ordinateur identifie chaque case par un nombre unique : l'adresse mémoire. Chaque routine est alors placée dans la mémoire à un certain endroit, localisable par son adresse, qui indique sa position dans la mémoire.

Pour retrouver la position de notre routine et savoir laquelle exécuter, certains ordinateurs utilisent une partie de leur mémoire pour stocker les adresses de début de toutes les routines d'interruption. En gros, cette partie de la mémoire contient les adresses permettant de localiser chaque routine. Cette portion de la mémoire s'appelle le vecteur d'interruption. Pour chaque interruption, une partie fixe de la mémoire contient l'adresse de début de l'interruption à effectuer.

Pour ceux qui connaissent un peu la programmation, vous pouvez voir ce vecteur d'interruption comme un tableau de pointeurs sur fonction, les fonctions étant les routines à exécuter.

Le BIOS initialise le vecteur d'interruption au démarrage de l'ordinateur et fournit quelques interruptions fondamentales de gestion du matériel. Néanmoins, le système d'exploitation peut fournir ses propres routines. Pour que celles-ci soient exécutées, il suffit à l'OS de détourner l'interruption. Cela consiste à remplacer l'adresse de l'interruption contenue dans le vecteur d'interruption par l'adresse de la routine que l'OS a chargée en mémoire (bien sûr, l'ancienne adresse est sauvegardée). 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.

II-B - Routines d'interruption du BIOS

Le BIOS fournit de base un grand nombre de routines d'interruption préprogrammées. Ces routines peuvent, par exemple, être exécutées quand on appuie sur une touche du clavier, ou quand une information en provenance de la souris est disponible sur le port PS/2.

De nos jours (depuis Windows 95), une fois le système d'exploitation chargé, ces routines ne peuvent être utilisées que par les noyaux des systèmes d'exploitation, et quelques pilotes. Pour ceux qui ne le savent pas, une fois le système d'exploitation chargé, la mémoire d'un ordinateur x86 (architecture 32 bits, ce qui signifie que nous pouvons charger 32 bits de données en même temps) est coupée en au moins deux portions, dont deux principales :

- une partie dans laquelle tout programme qui s'y trouve peut gérer les périphériques et effectuer des manipulations avancées sur la mémoire : l'espace noyau ;

- une autre pour les programmes qui ne doivent ni manipuler les périphériques ni faire de manipulations avancées sur la mémoire : l'espace utilisateur.

Nos routines sont alors inaccessibles par un programme localisé dans l'espace utilisateur. Uniquement les programmes localisés dans l'espace noyau ont le droit d'accéder au matériel. Seule une partie du système d'exploitation, nommée noyau et contenant quelques drivers, est placée dans l'espace noyau et peut donc faire exécuter les routines du BIOS si besoin est. Mais attention : cela ne vaut qu'une fois que le système d'exploitation est chargé (en fait, une fois que le processeur passe du mode réel où tout est permis au mode protégé où certaines opérations sont restreintes). Avant, la mémoire est gérée autrement, et il n'existe pas de distinction entre espace noyau et espace utilisateur, ce qui permet au BIOS de s'exécuter librement.

Les routines du BIOS, voire l'intégralité de son contenu, étaient parfois recopiées dans la mémoire RAM afin de rendre leur exécution plus rapide, à l'époque où celles-ci servaient encore (MS-DOS). La mémoire RAM est en effet bien plus rapide que la mémoire (EEP)ROM dans laquelle le BIOS est stocké. Certaines options du BIOS, souvent nommées BIOS memory shadowing (ou autres noms ressemblants), permettent justement de copier le BIOS dans une partie de la mémoire RAM afin d'accélérer l'exécution de ses routines. Sachez que ce genre de choses est inutile depuis que le BIOS ne sert plus qu'à l'allumage de l'ordinateur.

On va lister quelques routines importantes. Dans ce qui suit, l'adresse mentionnée sera l'adresse stockée dans le vecteur d'interruption de ladite routine (relisez plusieurs fois si besoin). Il faudra cependant être vigilant : la grande majorité de ces interruptions est détournée par notre système d'exploitation, et n'est utilisée que lors de l'allumage de l'ordinateur. En fait, dès qu'il existe un driver pour un périphérique quelconque, sachez que les routines du BIOS sont complètement détournées par votre OS.

Une grande partie de ces routines ont besoin qu'on leur fournisse des paramètres, des informations pour qu'elles fassent ce qu'elles doivent faire. Par exemple, une routine devant afficher une lettre à l'écran aura besoin qu'on lui donne en entrée la lettre à afficher. Pour chaque routine, il suffira de copier ces paramètres de la mémoire vers de petites mémoires ultra-rapides intégrées dans le processeur qu'on appelle les registres. Chacun de ces registres possède un nom qui permet de l'identifier : AX, AH, AL… Pour chaque routine, chaque registre contiendra une donnée ayant une signification bien précise pour notre routine. Ce seront souvent les registres AH ou AL du processeur.

Dans ce qui suit, nous listerons quelques routines pour montrer un peu leur utilité. On nommera ces routines.

Chaque routine est identifiée par :

- l'identifiant INT, qui sert à préciser que l'on souhaite exécuter une interruption ;

- les registres, utilisés pour configurer notre routine ;

- un numéro, qui permet d'identifier la routine à exécuter.

En effet, nos routines sont numérotées. Mais attention : ce numéro est un nombre hexadécimal ! En clair, INT 10 n'est pas la dixième interruption, mais la seizième. Pour ceux qui ne connaissent pas l'hexadécimal, rassurez-vous, vous pourrez comprendre la suite sans problème.

II-B-1 - INT 10h : affichage

Nos cartes graphiques actuelles contiennent toutes une mémoire ROM (voire EEPROM) contenant elle-même des tas de routines capables de faire afficher du texte et des graphismes monochromes ou 256 couleurs à l'écran. Dans les cartes graphiques compatibles avec les formats VGA/ESA, ce firmware (programme intégré au composant — le BIOS est un firmware), appelé improprement 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 drivers 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 1950…

Mais faites attention : une fois le pilote de la carte graphique démarré, ces fonctions de base ne servent plus ; le système d'exploitation, le driver vidéo et les programmes lancés gèrent eux-mêmes ce genre de choses et détournent sans vergogne les interruptions qu'ils souhaitent.

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. 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.

Exemple :

INT 0x10

Valeur à placer dans le registre AH

Description

INT 0x10

0x00

Permet de régler la résolution et le nombre de couleurs de l'écran.

INT 0x10

0x01

Place le curseur de la souris à la position voulue sur l'écran.

INT 0x10

0x03

Renvoie la position qu'occupe le curseur de la souris à l'écran.

INT 0x10

0x0E

Affiche un caractère ASCII.

II-B-2 - INT 11h

Cette routine renvoie un nombre codé sur 16 bits contenant des informations sur certains périphériques présents sur l'ordinateur.

II-B-3 - INT 12h

Cette routine ne prend aucun paramètre et renvoie la taille de la mémoire en kilo-octets dans le registre AX.

II-B-4 - INT 13h : mémoires de masse

Une routine du BIOS permet de lire ou d'écrire sur le disque dur ou sur une disquette. Cette routine lui sert à lire les premiers octets d'un disque dur afin de pouvoir charger le système d'exploitation, mais on verra cela au chapitre suivant.

Comme la routine INT 10, elle est polyvalente et on doit spécifier le traitement à effectuer en mettant le registre AH à une valeur unique pour chaque traitement.

Exemple :

INT 0x13

Valeur à placer dans le registre AH

Description

INT 0x13

0x00

Réinitialise le disque sélectionné.

INT 0x13

0x01

Vérifie l'état du disque.

INT 0x13

0x02

Lit une donnée à partir du disque sélectionné.

INT 0x13

0x03

Écrit une donnée sur le disque sélectionné.

…

…

…

Cette routine était utilisée par les systèmes d'exploitation du style MS-DOS pour lire ou écrire sur le disque dur. Mais cela appartient à l'histoire, et les OS actuels n'hésitent plus à détourner ces interruptions pour fournir des méthodes de gestion du disque bien plus efficaces.

II-B-5 - INT 14h : port série

Cette interruption était utilisée pour communiquer avec le port série RS232 de notre ordinateur. Comme les autres, elle est configurée par une valeur dans le registre AH.

INT 0x14

Valeur à placer dans le registre AH

Description

INT 0x14

0x00

Initialise le port série.

INT 0x14

0x01

Émet un caractère sur le port série.

INT 0x14

0x02

Réceptionne un caractère.

INT 0x14

0x03

Renvoie l'état du port série (occupé, libre…).

II-B-6 - INT 15h : fonctions système avancées

Cette interruption 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 INT 15 é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 prend tout seul en charge 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 les 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. Pour cela, nos OS configurent cette routine en plaçant la valeur 0x0000e820 dans le registre EAX. C'est une des très rares exceptions à la règle : les routines du BIOS sont obsolètes.

II-B-7 - INT 16h : clavier

Notre clavier communique avec notre ordinateur en envoyant trois sortes de signaux, qui permettent de déterminer ce que l'utilisateur fait avec son clavier. Chacun de ces signaux génère une interruption, qui sera interprétée par la routine adéquate.

Trois messages principaux sont utilisés :

- touche appuyée : signal spécifiant qu'on a appuyé sur une touche ;

- touche relâchée : signal spécifiant qu'on a relâché une touche ;

- et touche répétée, qui spécifie que la touche du clavier est restée enfoncée depuis le dernier envoi de message. Ce message sert quand on appuie continûment sur une touche sans la relâcher.

Chacun de ces signaux spécifie la touche en question, évidemment.

Cette routine permet de gérer une partie du clavier, et souvent de le configurer. Comme la routine INT 10, elle est très polyvalente et peut effectuer de nombreux traitements : on précise le traitement voulu en mettant le registre AH à une certaine valeur.

INT 0x16

Valeur à placer dans le registre AH

Description

INT 0x16

0x00

Identifie la touche tapée au clavier. Cette fonction est bloquante : on doit attendre la fin de l'exécution de cette routine avant de pouvoir faire exécuter quoi que ce soit d'autre par le processeur.

INT 0x16

0x01

Identifie la touche tapée au clavier. Cette routine est non bloquante.

INT 0x16

0x02

Spécifie le nombre maximal d'envois de messages (comme « touche répétée ») par seconde.

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. Encore une fois, ces routines sont détournées par le système d'exploitation à son lancement.

II-B-8 - INT 17h : port parallèle

Cette routine permet de communiquer avec une imprimante sur le port parallèle de l'ordinateur. Comme les autres, on la configure avec le registre AH.

INT 0x17

Valeur à placer dans le registre AH

Description

INT 0x17

0x00

Imprime un caractère.

INT 0x17

0x01

Initialise l'imprimante.

INT 0x17

0x02

Vérifie l'état de l'imprimante (en cours d'impression, libre…).

II-B-9 - INT 19h

C'est une surprise !

Vous verrez dans le chapitre sur le démarrage d'un ordinateur.

II-C - Conclusion

Comme vous le voyez, le BIOS fournit beaucoup de routines qui étaient au départ sensées faciliter la gestion du matériel. Il y a longtemps, cela simplifiait la conception des systèmes d'exploitation, et de nombreux OS, tel MS-DOS, utilisaient ces fonctions. Mais de nos jours, connaître ce genre de choses est plus synonyme d'archéologie expérimentale qu'autre chose.

III - Démarrage d'un ordinateur x86

Comme je l'ai dit plus haut, le BIOS sert aussi à 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. Durant cette phase, les périphériques sont détectés, testés et configurés pour garantir leur fonctionnement. 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 volts, 5 volts et 3,3 volts, 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 64 premiers kilo-octets de la mémoire, par exemple.

Étape suivante : initialiser le vecteur d'interruption de notre ordinateur avec ses valeurs par défaut, fournies par le BIOS. Si le vecteur d'interruption est écrit sans erreur dans la mémoire RAM, le BIOS émet un petit bip, pour signaler que tout va bien. En effet, un buzzer est placé sur la carte mère et est directement commandable par le processeur. Au moindre problème à l'allumage, le processeur demande à ce buzzer de bipper. 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. Chaque fabricant a sa propre manière de faire bipper le buzzer en cas d'erreur.

Ensuite, le clavier et la carte vidéo vont être configurés par les routines vues plus haut. Pour détecter la présence d'une carte vidéo VGA/ESA, le BIOS regarde les adresses mémoire 0x000C 0000 et 0x000E 0000 : ce sont les adresses d'une mémoire ROM, intégrée à la carte graphique, qui contient toutes les fonctions de base servant à afficher des graphismes à l'écran. 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.

À la suite du POST et après avoir détecté les périphériques en communiquant avec les différents bus système, notre BIOS va chercher lesquels peuvent contenir un système d'exploitation qu'il peut charger.

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

Dans les anciens ordinateurs, le seul programme que pouvait exécuter l'ordinateur était un simple programme stocké dans une mémoire ROM. Mais avec l'apparition d'ordinateurs plus sophistiqués, on a rendu possible l'exploitation par un ordinateur de programmes différents de celui placé dans sa mémoire ROM. L'invention des systèmes d'exploitation a été un pas de plus dans ce sens, mais il a fallu trouver un moyen de démarrer l'ordinateur de façon à charger un système d'exploitation à partir d'une mémoire autre que la mémoire ROM placée sur sa carte mère.

Dans tous les ordinateurs, le système d'exploitation est placé sur le disque dur, la carte mère n'a alors aucun moyen de charger le système d'exploitation directement depuis le disque dur dans la mémoire RAM pour qu'il puisse s'exécuter. Pour résoudre ce problème, on laisse faire le BIOS.

III-B - Rappels sur le disque dur

Comme vous le savez tous, un disque dur est un périphérique servant à mémoriser des données de façon permanente : les données inscrites sur un disque dur ne s'effacent pas quand on coupe le courant. Ce disque dur est composé de plusieurs plateaux, fabriqués dans un matériau magnétique et sur lesquels on inscrit des données. Notre disque dur est découpé en petits blocs de données, chacun capable de contenir un bit, qu'on aimantera dans une direction pour stocker un 1 et dans l'autre sens pour stocker un 0.

III-B-1 - Secteurs, cylindres et têtes

Un disque dur contient plusieurs de ces plateaux. Mais il faut connaître un peu la façon dont chaque plateau est organisé avant de poursuivre. J'ai parlé plus haut de ces cellules capables de stocker un bit ; eh bien, sachez que plusieurs de ces bits, appartenant à différents plateaux, sont superposés les uns au-dessus des autres. Cela forme ce qu'on appelle un cylindre. Pour un disque dur possédant cylindres, ceux-ci sont numérotés de à .

Les cellules d'un même plateau sont regroupées en paquets de plusieurs centaines de bits qui se suivent les uns à côté des autres : les secteurs. Pour simplifier le travail de l'électronique du disque dur, on préfère utiliser des paquets ayant une taille de la forme . Sur les disques durs actuels, un secteur a une taille de 512 octets, soit 4 096 bits. Ces secteurs sont numérotés en commençant à 1.

Notre disque dur contient aussi de petits dispositifs mobiles capables de lire ou écrire une donnée sur le disque dur : les têtes de lecture / écriture, avec une tête de lecture par plateau. Un disque dur en possède plusieurs. Pour un disque dur contenant têtes de lecture / écriture, on les numérote de à .

III-B-2 - Adressage CHS

Pour localiser un secteur sur un disque dur, il suffit alors de préciser le numéro du cylindre, le secteur et la tête de lecture (pour préciser le bon plateau). Cette façon d'adresser un secteur du disque dur s'appelle l'adressage CHS. Le seul problème avec cet adressage, c'est que le BIOS utilise 10 bits pour coder le numéro du cylindre, 8 bits pour le numéro de tête (parfois 4) et 6 bits pour le numéro de secteur, ce qui limite la taille maximale possible du disque dur à environ 500 méga-octets. Pour contrer cette limite et pour que le BIOS détecte les disques durs avec la bonne taille au démarrage, on a inventé diverses astuces.

Une de ces astuces consiste à transformer les coordonnées CHS codées sur 24 bits (10 bits pour le cylindre + 8 pour le numéro de tête + 6 pour le numéro de secteur) en coordonnées de 28 bits. Pour cela, les routines de gestion du disque dur ont été modifiées pour réaliser ces traductions de coordonnées, ce qui a repoussé la limite de taille des disques durs à environ 8 Go.

Enfin, devant la progression de la taille des disques durs, on a inventé l'adressage LBA. Celui-ci numérote simplement chaque secteur du disque dur par un nombre, sans se préoccuper de son numéro de tête, de cylindre ou de secteur. Il est donc identifié par un simple nombre : l'adresse logique, qui peut être traduite par le BIOS ou l'électronique intégrée dans le disque dur en une adresse CHS codée sur suffisamment de bits.

Nos BIOS peuvent utiliser différents types d'adressage en fonction de la carte mère et certains peuvent en utiliser plusieurs (aussi bien CHS que LBA, par exemple). En fait, la routine standardisée INT 13 manipule des coordonnées CHS, mais on peut parfaitement trouver d'autres routines complémentaires qui travaillent avec des coordonnées LBA. Certaines ne sont pas standardisées, mais d'autres le sont : on peut citer notamment les Enhanced Disk Drive.

III-C - MBR

Le MBR, abréviation de Master Boot Record, est le nom donné au premier secteur du disque dur (aussi bien en adressage LBA qu'en adressage CHS). Ses coordonnées CHS sont donc (0, 0, 1). C'est dans ce MBR que toutes les informations nécessaires au démarrage d'un système d'exploitation sont placées. Ce MBR est assez bien organisé et contient trois grandes parties aux usages différents.

III-C-1 - Code exécutable

Les premiers octets du MBR sont remplis par un programme servant à charger le système d'exploitation. Ceux-ci sont chargés à la fin du POST, par la routine INT 19h, qui copie le premier secteur dans la mémoire RAM, à l'adresse 0x7C00. Cette routine configure ensuite le processeur en plaçant l'adresse de base de ce code en mémoire (notre fameux 0x7C00) dans le registre pointeur d'instruction E(IP) du processeur, ce qui permet d'exécuter ce programme et donc de lancer l'OS.

Toutefois, il existe quand même une condition à cela : à la toute fin du MBR, les deux derniers octets doivent avoir une valeur bien précise pour que le BIOS autorise l'exécution de ce programme. 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.

Ce programme est suivi par quelques octets optionnels, souvent vides, puis par la table des partitions. Le programme en lui-même fait 440 octets.

III-C-2 - Table des partitions

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).

III-C-3 - Messages d'erreur

Il existe enfin une zone contenant 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.

IV - CMOS RAM et autres

Vous avez sûrement remarqué que notre ordinateur est capable de retenir la date, et ce même débranché ? Eh bien notre BIOS a un petit rapport avec cela !

IV-A - CMOS RAM

Dans un ordinateur, et dans tout composant électronique capable de conserver une heure ou une date, on trouve une mémoire capable de retenir l'heure et la date. Mais cela ne suffit pas : il faut aussi que l'heure ne se dérègle pas, et pour cela, il faut continuer à compter, même quand l'ordinateur est débranché. Il nous faut donc un circuit capable de compter, qui est incrémenté de façon cyclique à chaque fois qu'une durée bien précise s'est écoulée. Enfin, il nous faut aussi une source d'énergie qui remplace l'alimentation secteur lorsque l'ordinateur est débranché, pour alimenter ces circuits. Cette source d'énergie est quasiment toujours une pile au lithium installée sur la carte mère.

Pour récapituler, il nous faut donc :

- une horloge, pour synchroniser les composants ;

- un compteur, qui est un circuit comptant de un en un à chaque tic d'horloge (ou en plusieurs tics d'horloge, c'est selon) ;

- une mémoire capable de conserver la date et l'heure, qui sont mises à jour au besoin (date, heure…) ;

- et une pile pour alimenter le tout.

Première précision : l'horloge dont je viens de parler n'a rien à voir avec l'autre horloge nommée horloge système, créée pour cadencer les différents bus, et qui est utilisée par le processeur et la mémoire pour ajuster leur fréquence. On va appeler l'horloge censée compter le temps l'horloge RTC, pour Real Time Clock. La RTC est créée par un oscillateur à quartz, et a une fréquence qui est souvent calibrée à 32768 Hz. Cette fréquence correspond à cycles d'horloge par seconde, ce qui permet de compter à la seconde près sans décalage. Du moins en théorie, car cette horloge n'a pas une fréquence de 32768 Hz tout pile, et quelques ajustements sont parfois nécessaires.

Autre précision : la mémoire utilisée pour stocker l'heure est une mémoire SRAM ! Ce n'est pas une mémoire EEPROM, comme on pourrait le penser. Il s'agit souvent d'une mémoire fabriquée avec des transistors CMOS, d'où son nom de CMOS RAM.

D'autres circuits additionnels permettent de mettre à jour l'heure, les minutes, les secondes ou la date présentes dans la CMOS SRAM (en cas de changement d'heure, par exemple). Les circuits de gestion de l'horloge, le compteur de temps ainsi que la mémoire RAM sont placés en dehors du BIOS et sont lus par le BIOS au démarrage. Seuls les circuits de gestion du temps, l'horloge (différente de l'horloge système) et la mémoire RAM sont encore alimentés par la pile de l'ordinateur une fois celui-ci éteint.

IV-B - Autres paramètres du BIOS

Les paramètres modifiables du BIOS sont souvent 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. De nos jours, cette mémoire est fusionnée avec le circuit de gestion du temps et est placée directement dans le southbridge dans un seul et unique circuit.

Cette mémoire, la mémoire CMOS, est adressable, ce qui signifie qu'on peut y accéder par une adresse. Mais on y accède indirectement, car on communique avec cette adresse comme si c'était un périphérique : le contenu de la CMOS RAM ne peut pas être écrit ou lu directement case mémoire par case mémoire par notre processeur, mais il peut envoyer des ordres de lecture ou des informations à écrire une par une sur une adresse bien précise. Cela lui permet d'aller lire les informations contenues dans cette RAM, pour afficher l'heure dans son menu de configuration, par exemple. On y accède via les adresses 0x0007 0000 et 0x0007 0001 (ces adresses sont écrites en hexadécimal).

V - Conclusion

Et voilà, vous savez maintenant ce qu'est le BIOS.

Pour ceux qui désirent en savoir un peu plus sur les interruptions du BIOS, voici quelques liens :

- interruption INT 10h ;

- interruption INT 13h.