9 votes

ASM x86 en mode réel : comment faire les choses de base ?

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.

7voto

Hans Passant Points 475940

Ces adresses ont été gravées dans le marbre il y a 30 ans, lorsque IBM a sorti le premier PC. 0x3f0 est la première adresse pour les registres primaires du contrôleur de disquette. Une liste d'adresses est disponible ici .

L'équipe de conception d'IBM a pris une décision inhabituelle en assemblant la machine à partir de pièces standard disponibles dans le commerce. La plupart des puces provenaient d'Intel, le contrôleur de disquette était une conception NEC. Sans le vouloir, ils se sont assurés que tout le monde pourrait construire un clone. Ces clones utilisaient les mêmes adresses pour assurer la compatibilité des logiciels, transformant le choix d'IBM en une norme industrielle qui pouvait être codée en dur.

6voto

adelphus Points 1463

Tout d'abord, bienvenue dans le monde de l'assembleur Realmode ! Vous avez probablement déjà réalisé que l'assembleur actuel est pratiquement le même en mode realmode et en mode protégé - les principales différences étant la taille des opérandes et la disposition/gestion de la mémoire.

Il existe des ressources pour le realmode sur Internet - il faut juste les trouver ! Une ressource très importante est L'interruption de Ralf Brown (connue sous le nom de RBIL) - elle fournit beaucoup d'informations sur les différentes interruptions utilisées dans la programmation realmode. Un autre site est celui de BiosCentral Carte mémoire CMOS qui décrit les informations que le BIOS stocke (ou devrait stocker) dans divers emplacements mémoire.

Pour répondre à certaines de vos questions sur le code Linux que vous avez posté : outb est l'instruction pour écrire l'octet dans al au port dx - 0x3f2 est le port du contrôleur de disquettes. Wikipedia peut vous aider à obtenir la liste de base des numéros de port x86, mais vous devrez creuser pour obtenir des informations détaillées sur le format réel du fichier al bits.

quelles plages d'adresses mémoire sont disponibles pour écrire pendant le mode réel ?

Vous devriez faire quelques recherches sur INT 15h, AX=E820h - il renvoie une carte mémoire décrivant les zones de mémoire qui peuvent être utilisées et celles qui sont réservées. Notez cependant que lorsque vous regardez les interruptions, il est important de voir à quel point elles sont "nouvelles" car les anciens BIOS peuvent ne pas les supporter.

... reprogrammer les interruptions pour éviter une collision entre le BIOS et le matériel interne. interruptions

De nombreux dispositifs matériels ont des interruptions programmables (qui sont utilisées pour entretenir le matériel lorsqu'il a besoin d'attention). En général, le BIOS procède à une affectation initiale pendant ses routines de démarrage, mais il n'est pas rare que les systèmes d'exploitation modifient les interruptions matérielles pour leurs propres besoins ou pour éviter des incompatibilités connues.

Une dernière remarque : it seems that numbers like #0x3f2 are being pulled out of thin air . La réponse est oui. Une grande partie des sources de démarrage de Linux sont horribles (oui, c'est juste mon opinion) et semblent saupoudrer des adresses, des numéros de port et d'autres bits de manière apparemment aléatoire sans aucune explication significative. Tenez bon, consultez d'autres ressources realmode et vous finirez par comprendre. Oh, et si vous rencontrez un référence complète - le dire à TOUT LE MONDE (car il n'existe pas actuellement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X