6
votes

Comment gérer le clavier en mode réel via les interruptions de BIOS?

Je dois coder pour un système d'exploitation sur lequel je peux exécuter une Calculater.Il est comme un calcul de bureau. Pour cela, je lis je lis le Série de développement opérationnel de Brokenthorn J'ai terminé le Deuxième étape de bootloader Le chargeur de démarrage est en mode réel. Après cela, l'auteur explique le mode protégé. Je ne veux pas utiliser le mode protégé. Je n'ai pas le temps pour ça. Je souhaite donc écrire le calculateur en mode réel en utilisant des interruptions de BIOS. C'est possible? Je pense que cela peut être écrit sur la deuxième étape du chargeur de démarrage (je ne suis pas sûr.) Signifie que je n'ai pas à utiliser un noyau (je ne suis pas sûr). Je ne sais pas comment utiliser les interruptions de BIOS pour gérer le clavier. Quelqu'un peut-il me fournir un lien qui m'aidera à cela? Et si quelque chose qui ne va pas dans Whatevet, j'ai supposé ci-dessus, veuillez me corriger. Merci à l'avance.


1 commentaires

Vous trouverez [PC Interruptions] [1] comme un outil inestimable. Vous pouvez l'obtenir sur le lien pour <4,00 $. [1]: Amazon.com/pc-interrupts-programmers- Référence-tiers / d p / ...


3 Réponses :


5
votes

Vous pouvez gérer IRQ 1 (mappé sur l'interruption 9 par le contrôleur X86) et lire les touches du port 60H .

voir http://inglorion.net/documents/tatulys/x86ostu/keyboard/.


4 commentaires

-1. Ce n'est pas IRQ 9, c'est IRQ 1: webopedia.com/quick_ref/irqnumbers.asp . IRQ 9 est disponible pour d'autres périphériques génériques tels que des périphériques PCI. IRQ1 est l'interruption du clavier.


@Matt, à partir du lien dans ma réponse: Le contrôleur de clavier utilise IRQ 1. Le contrôleur d'interruption X86 est en panne pour interruption 9, la réception d'une IRQ à partir du contrôleur de clavier a le même effet que l'exécution de l'INT 9.


Si la photo n'est pas remappée et que vous n'utilisez pas d'Ioapic, il est identique à l'exécution de l'interruption 9 (qui se chevauche avec l'exception NPX_Overrun CPU, pas le gestionnaire IRQ9). Bien que le mappage entre IRQS et interruptions soit configurable, IRQ9 NEHER == IRQ1. En effet, à partir de votre propre lien: Le contrôleur de clavier utilise IRQ 1 . Étant donné que tous les OSES remapperont la photo de sorte que les IRQ ne chevauchent pas les exceptions de la CPU, votre réponse serait préférable de dire que le clavier utilise l'IRQ1.


@Matt, vous avez un point, IRQ 1 est effectivement cartographié pour interruption 9 mais pas à IRQ 9. J'ai essayé de clarifier cela dans ma réponse. Merci pour l'information :)



10
votes

Si vous souhaitez utiliser des services de clavier BIOS de haut niveau, plutôt que de gérer vous-même le clavier vous interrompt, alors int 16h est ce que vous voulez.

int 16h avec ah = 00h ou 10h bloquera en attente d'une clé à clavier (Retourne ASCII Résultat dans al ); Utilisez ah = 01H ou 11H Pour interroger si une touche de clé est disponible en premier si vous souhaitez éviter de bloquer (retour immédiatement avec zf effacer si une touche est disponible ou défini si non). Voir par exemple ici ou ICI (ou Google" int 16h "pour plus).


1 commentaires

Pardon, bon monsieur - Toute idée de «gérer le clavier vous interrompt» sans le service BIOS de haut niveau? Quels sont les inconvénients de l'utilisation d'un service de haut niveau? La performance est-elle pire?



3
votes

Exemple de BIOS BIOS BIOS BIOS STRAND>

Lorsque vous entrez un caractère, il est imprimé sur l'écran. P>

Main.S P>

as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
qemu-system-i386 -hda main.img


4 commentaires

Un problème potentiel avec votre code est que vous supposez que vous disposez d'un segment de pile valide (SS) et d'un pointeur de pile (SP). Les interruptions de BIOS nécessitent des espaces de pile afin que ce soit une bonne pratique de configurer un ss valide et sp avant d'émettre des appels de BIOS. Vous ne pouvez pas vraiment compter sur l'état des registres de segment au moment où le BIOS saute à votre code chargé du secteur de la démarrage. Les environnements émulsés et VM sont souvent gentils de laisser des choses dans un état valide, mais sur un véritable matériel qui n'est pas toujours le cas.


@MichaelPetch merci pour l'info! Je vais regarder dans ça. Que dois-je les mettre? Pour SP , toute mémoire élevée supérieure à 0x7C00 est bien ou y a-t-il une valeur meilleure plus spécifique? SS à 0 Je suppose.


Tout ce qui est utilisable, c'est bien, mais je reste généralement à l'écart de quelque chose de moins de 0x0000: 0x1000 et ci-dessous. Vous pouvez mettre le segment de pile juste en dessous de 0x0000: 0x7c00 (généralement ce que j'ai fait dans le passé)


@MichaelPetch OK! A trouvé cette question à: Stackoverflow.com/Questtions/10598802/...