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