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

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

a marqué ce sujet comme résolu.

Malheureusement, ce tutoriel qui était en bêta a été supprimé par son auteur.

Reprise d'un ancien tutoriel provenant du sdz. Des modifications ont étés apportées : j'ai notamment supprimé les rappels inutiles sur les interruptions, le disque dur, etc. Cela permet de remarquablement simplifier le propos, les pré-requis étant abordés dans "Fonctionnement d'un ordinateur de zéro". A voir s'il ne reste pas quelque quircks, cependant.

+1 -0
Banni

Ne faudrait-il pas mettre à jour le contenu du tuto, puisque le BIOS est remplacé par l'UEFI depuis quelques années par certains fabricants ? Ainsi, lorsqu'en 2006 Apple est passée aux processeurs Intel, elle a utilisé l'EFI, successeur du BIOS dans le monde Intel, en remplacement de l'Open Firmware utilisée précédemment.

C'est pas une mauvaise idée. Mais dans ce cas, je ferais un tutoriel qui parlerait à la fois du BIOS, de l'UEFI, éventuellement de l'open Firmware, et les autres alternatives : un extrait pour chaque. Après, cela prendra surement un peu de temps à rédiger, aussi je peux me contenter d'un premier jet sur le BIOS uniquement, avec ce qui est déjà en bêta. Mais c'est une idée d'évolution intéressante.

+0 -0
Banni

« Dans tous les PC actuels, le système d'exploitation est placé sur le disque dur. ». Il date de quand le tuto d'origine ? Je demande car les systèmes sur SSD sont de plus en plus courants. Je pense qu'il faudrait en tenir compte. Hélas, je ne peux pas mieux aider sur le contenu du tuto, n'ayant globalement aucune connaissance en ce domaine.

Pour un fois, tu écris un tuto sur un sujet que je maîtrise assez bien, donc je peux te faire un retour assez détaillé.

Chaque ordinateur contient au moins une mémoire de type ROM sur laquelle se trouve un programme : le BIOS.

À ma connaissance, la plupart des ordinateurs qui utilisent une puce ARM sont dénués de BIOS à proprement parler. C'est d'ailleurs la difficulté pour porter un OS sur ces systèmes : il faut réécrire la procédure de démarrage, de détection du matériel et de gestion minimale de celui-ci pour chaque carte-mère.

De même tout le reste du tuto est clairement orienté sur une architecture x86, donc c'est à préciser.

programme basique d'entrée − sortie

Pas d'espaces autour du tiret.

ne lance les drivers graphiques

Ou « pilotes » si tu veux éviter l'anglicisme.

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…

Je suis pas d'accord ! VGA a été standardisé en 1987, c'était hyper-moderne au début des années 1990… :D

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.

Mouais… C'est un chouïa plus compliqué que ça. Sur tous les BIOS dans lesquels j'ai pu mettre mon nez, le vecteur d'interruption 10h pointe sur une adresse dans le segment 0xc000, et les mentions de copyright de ce bout-là ne sont pas les mêmes que celles du BIOS proprement dit.

Tout ça pour dire que le BIOS définit une API et que les firmware des cartes graphiques doivent s'y conformer. Et très sincèrement, j'ignore si le BIOS possède des bouts de code dédiés à causer avec la carte graphique qui seraient « recouverts » par le firmware de ladite carte.

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.

Déjà, cette int 13h a connu des évolutions au cours du temps, avec l'introduction des fonctions étendues (commandes 41h à 49h) qui permettent de dialoguer de manière plus abstraite et sécurisée avec les périphériques de stockage.

Ensuite, j'en profite pour introduire une remarque qui s'applique à toutes les fois où tu parles de l'OS qui surcharge les interruptions. La raison principale pour laquelle les OS font leur propre gestion du matériel, c'est que les interruptions sont en code machine 16 bits et sont donc faites pour fonctionner en mode réel et deviennent totalement inaccessibles en mode protégé / mode long.

Ce n'est pas pour rien qu'avant de changer de mode, il faut définir ses propres routines d'interruption, créer sa propre table de vecteurs d'interruption, en placer l'adresse dans le registre de config adéquat et alors seulement changer le bit de (E)FLAGS qui passe le processeur en mode protégé. Sinon, bonjour la cata !

  • 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 ;

Un chouïa redondant⋅

INT 0x16 0x01 Identifie la touche tapée au clavier. Cette routine est non bloquante.

Et surtout, elle ne retire pas la touche en question du buffer clavier. Il faut impérativement passer par la commande 0x00 si on veut pouvoir connaître les touches qui ont été entrées ensuite.

permettent justement de d'autoriser ou

-de

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.

Tu as déjà dit plus ou moins la même chose dans le passage sur l'int 10.

A ce stade du démarrage

À.

dans une mémoire FLASH

Tu écris flash en minuscule dans le reste du tuto.

Le BIOS doit se charger de charger le système

Répétition pas très heureuse.

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.

  • Tu voulais pas plutôt dire (E)IP ?
  • La formulation est vraiment pas claire. Je pense que parler d'un saut à l'adresse 0x7c00 serait plus compréhensible.

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.

Là aussi, je ne trouve pas très clair de placer ce paragraphe là : le BIOS commence par copier le secteur de boot dans la RAM (parce qu'il ne sait pas bosser directement sur le disque dur), puis il vérifie le nombre magique et alors seulement, si la condition est respectée, il effectue le saut. Je trouve que ta formulation induit en confusion.

En outre, tu fais une méprise classique sur le nombre magique. Il s'agit bien du word 0xaa55, mais les proço x86 étant petit-boutistes, c'est 0x55 0xaa qu'il y a effectivement sur le disque, donc 0101010110101010 en binaire (et je sais pas combien en décimal).

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

Je ne suis pas complètement d'accord avec ta répartition. Premièrement, les messages d'erreur font partie intégrante du bootloader : si celui-ci est remplacé par un programme extérieur (au hasard, GRUB), les messages d'erreur seront remplacés aussi.

Deuxièmement, ta formulation donne l'impression qu'ils sont placés après la table des partitions, alors que dans la plupart des cas, il n'y a rien entre la table de partoches et le nombre magique.

Troisièmement, dans bon nombre de MBR pas trop anciens (ça remonte au moins à 2000), la table des partitions est précédée d'une signature du disque sur 4 octets et d'un « verrou » anti-copie de 2 octets (qui vaut donc 0 la plupart du temps).

Maintenant, quelques remarques d'ordre général sur le tuto.

Il y a vraiment un problème de pré-requis. J'ai bien lu que tu envisageais ce tuto comme une suite du tuto général sur les ordinateurs, mais il est impératif de le signaler dans l'introduction. En effet, certaines notions sont utilisées comme allant de soi qui rendent la compréhension très difficile si on ne les possède pas.

Je pense en particulier au principe des interruptions : ce qu'elles sont, le fonctionnement par vecteur d'interruption, et la possibilité de surcharger ce vecteur. Les deux citations suivantes, par exemple, sont incompréhensibles sans cette maîtrise.

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

détournent sans vergogne les interruptions qu'ils souhaitent.

Je pense également au fait que tu donnes des adresses mémoire en notation 16 bits, qui est totalement non-intuitive, surtout si, comme tu le fais, on ne met pas le double point entre le segment et le décalage.

TL;DR : définis mieux les pré-requis dans l'intro.

Par ailleurs, je trouve la description que tu fais des interruptions assez sommaire. En particulier, tu donnes la commande mais pas les autres paramètres, de telle sorte qu'on est toujours aussi incapable de les utiliser avant qu'après ton tuto.

Tu ne parles pas non plus des faux vecteurs d'interruption, qui peuvent pourtant être très utiles. Par exemple, « l'interruption » 1f pointe en fait vers une table de bitmaps en 8x8 servant à représenter les caractères de l'ASCII étendu : c'est en passant par là qu'on peut définir ses propres caractères non ASCII et donc implémenter d'autres langues que l'anglais en mode réel.

Donc soit tu te contentes de balayer vite fait en quelques paragraphes le type de fonctions qu'implémente le BIOS, soit tu fais une description suffisamment complète pour être utilisable, mais pas cet espèce d'entre-deux. Dans un cas comme dans l'autre, un lien vers la RBIL serait un vrai plus.

Enfin, je trouve assez étrange de parler des interruptions après le POST. Je trouverais plus logique d'expliquer comment le BIOS lance l'ordinateur et met en place un environnement de travail minimal, dont les interruptions font partie, et ensuite seulement de détailler certains aspects de cet environnement, en particulier les interruptions.

Notamment, ton organisation t'empêche de parler de la BDA, qui est pourtant un aspect essentiel du fonctionnement du BIOS, et dont celui-ci fixe l'état premier au cours du POST. Un certain nombre d'interruptions vont consulter / modifier la BDA, voire se contentent de faire ça, comme l'int 12 (taille de la RAM) qui va simplement voir la valeur du champ idoine dans la BDA. ^^

PS : Je ne crois pas avoir vu que tu expliquais comment le POST était amorcé (saut à l'adresse 0xffff:0000).

+0 -0

Mouais… C'est un chouïa plus compliqué que ça. Sur tous les BIOS dans lesquels j'ai pu mettre mon nez, le vecteur d'interruption 10h pointe sur une adresse dans le segment 0xc000, et les mentions de copyright de ce bout-là ne sont pas les mêmes que celles du BIOS proprement dit. Tout ça pour dire que le BIOS définit une API et que les firmware des cartes graphiques doivent s'y conformer. Et très sincèrement, j'ignore si le BIOS possède des bouts de code dédiés à causer avec la carte graphique qui seraient « recouverts » par le firmware de ladite carte.

Dominus Carnufex

Et pour les cartes graphiques d'avant le EGA/VGA, comme les cartes MDA et CGA, qui ne possédaient pas de bios vidéo ?

Là, je ne parle pas d'expérience, parce que je n'ai jamais eu d'ordinateur aussi vieux entre les mains. Mais d'après ce que j'ai pu trouver :

  • quand le BIOS a fini le POST, il passe la main aux « BIOS annexes » mappés en mémoire, qui font leur propre POST et peuvent modifier la table de vecteurs d'interruption, avant de (en principe) rendre la main au BIOS pour la suite du boot ;
  • le BIOS des premiers IBM PC gérait effectivement lui-même l'affichage vidéo : la Référence Technique publiée en 1981 (attention, PDF de 16 mégas !) contient le code source complet du BIOS (commence page 191) dans lequel on trouve effectivement toute une partie consacrée à l'int 10 (page 233 et suivantes) ; la Référence Technique de l'IBM PC AT (1984) (26 mégas !) contient aussi le code source (p. 165) et la section consacrée à la vidéo (p. 265 et suivantes).

En conclusion, les firmware viennent effectivement « recouvrir » la programmation native du BIOS. Ce que je ne sais pas, c'est si les BIOS actuels (qui ne sont plus codés par IBM) ont toujours une int 10 native, sachant que maintenant toutes les cartes graphiques ont leur propre firmware.

+0 -0

Une partie des remarques faites au-dessus ont étés prises en compte. A vous de me dire si c'est un peu mieux ou non. J'en ai profité pour rajouter pas mal d'informations, notamment sur l'organisation de la mémoire des PC, avec la mémoire haute/conventionnelle. J'ai aussi introduit des trucs sur les bios d'extension, et la procédure pour les détecter effectuée par le BIOS système.

Merci pour vos relectures

+0 -0

Merci d'avoir pris en compte mes remarques. Voilà ce que je peux dire sur cette nouvelle mouture (essentiellement des broutilles orthographiques).

Si le contenu des BIOS d’extension dépend fortement de la carte graphique en question

Tu expliques à la ligne au-dessus que les BIOS d'extension ne concernent pas que les cartes graphiques, alors il faudrait un terme plus général.

l'adresse 0xFFFF : FFF0h (l'adresse maximale moins 16 Bytes).

Cette adresse correspondrait à l'adresse « aplanie » 0x10FFE0 qui est en dehors des bornes. L'adresse de lancement du POST est bien 0xFFFF:0000 (et pour la petite histoire, elle contient systématiquement un far jump suivi d'une date ^^ ).

Et bytes, sans majuscule et en italique.

des programmes en mode réels

Sans -s à réel.

et a une taille de 255 Bytes

Cf. supra.

sur le premiers PC

Il manque un -s ou il y en a un de trop.

les 640 premiers kilo-octets de la mémoire, par exemple.

Tu as fait le choix dans les paragraphe ajoutés depuis la dernière bêta de parler de kibioctets, il faudrait mettre celui-ci en conformité.

Si un BIOS d'extension est présent, celui-ci impose une signature,

Je vois ce que tu veux dire, mais je ne trouve pas la formulation très claire. Peut-être quelque chose dans les tons de « Pour détecter la présence d'un BIOS d'extension, le BIOS système recherche au début de l'espace mémoire concerné une signature, […] ».

Cette valeur est suivie par un byte

Cf. supra.

Screenshot de l'interface d'un BIOS

Screenshot, en italique.

l'endianess, diraient les anglo-saxons)

endianness, avec deux -n- et Anglo-saxons, avec une majuscule.

Ces routines peuvent des traitements parfois très complexes

Manque un mot.

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 tu as échangé l'ordre des extraits, les explications en question se retrouvent dans l'extrait précédent.

Comme la routine INT 10,

la routine INT 15 était utilisée

La routine INT 16h permet de gérer

Comme la routine INT 10h,

La plupart du temps, tu ne mets pas le INT et tu précises -h après le nombre. Ce serait plus cohérent de le faire ici aussi.

En outre, tu expliques pas moins de quatre fois que la fonction spécifique à exécuter de chaque interruption est déterminée par le contenu de AH : il serait certainement moins répétitif de le préciser une bonne fois pour toutes dans l'intro de cet extrait. Tu pourrais en profiter pour dire que c'est également AH qui reçoit la valeur de retour de toutes les interruptions.

+0 -0

Les remarques vues plus haut ont étés prises en compte. Visiblement, le tutoriel a atteint un point où il n'y a plus grand chose à ajouter, ni à revoir. En conséquence, je désactive la bêta, et laisse faire les validateurs faire leur travail.

+0 -0
Ce sujet est verrouillé.