Je suis en train de lire le boot.s
dans les sources du tout premier noyau Linux (en supposant que la version 0.01 soit effectivement la première version publique).
Je connais C et ASM, ce dernier beaucoup moins que le premier. Malgré cela, il semble que je sois capable de comprendre et de saisir l'essentiel du code dans les fichiers sources.
Ce dossier me laisse perplexe. Je réalise maintenant que c'est parce qu'il est en mode réel, pas en mode protégé. Inutile de dire que je n'ai jamais vu de code ASM écrit en mode réel auparavant. Le mode protégé était le mode de facto sur lequel tournaient les OS x86 avant même que je sois né, donc il faut s'y attendre.
Voici une routine que je veux mieux comprendre :
/*
* This procedure turns off the floppy drive motor, so
* that we enter the kernel in a known state, and
* don't have to worry about it later.
*/
kill_motor:
push dx
mov dx,#0x3f2
mov al,#0
outb
pop dx
ret
Regarder vers le haut outb
je trouve que c'est utilisé pour passer des octets aux ports de l'ordinateur. Je vais tenter de deviner, en me basant sur la documentation C, que ce scénario passe l'octet 'stop motor' comme premier argument, et le numéro de port du lecteur de disquettes comme second.
Cette interface est-elle fournie par le BIOS ? Ou directement par le lecteur de disquettes ? Je suppose que le BIOS dispose de "pilotes" économes pour le fonctionnement de base de tous les périphériques fondamentaux.
C'est là que je suis perplexe : il semble que des nombres comme #0x3f2
sont tirées de l'air. Ce sont clairement des numéros de port de matériel ou autre. Ce fichier est parsemé de tels numéros, sans aucune explication sur ce à quoi ils se réfèrent. Où puis-je trouver une référence complète qui montre tous les ports matériels et les numéros de contrôle qu'ils peuvent recevoir en mode réel ? De plus, il semble que le fichier déplace le noyau en mémoire tout au long des processus de démarrage, avec des adresses mémoire codées en dur. Où puis-je trouver un guide indiquant quelles plages d'adresses mémoire sont disponibles pour l'écriture en mode réel ?
J'ai également lu un commentaire de Linus sur la reprogrammation des interruptions pour éviter une collision entre le BIOS et les interruptions matérielles internes. Je ne vais pas mentir, ça m'est passé au-dessus de la tête.
De l'aide serait la bienvenue ; Google ne semble pas s'intéresser à ce sujet, au cas où vous vous poseriez la question.