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. P>
3 Réponses :
Vous pouvez gérer IRQ 1 (mappé sur l'interruption 9 par le contrôleur X86) et lire les touches du port voir http://inglorion.net/documents/tatulys/x86ostu/keyboard/ a>. p> 60H code>. P>
-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. Code >
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 code>. É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 :)
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 code> est ce que vous voulez. P>
int 16h code> avec
ah = 00h code> ou
10h code> bloquera en attente d'une clé à clavier (Retourne ASCII Résultat dans
al code >); Utilisez
ah = 01H code> ou
11H code> Pour interroger si une touche de clé est disponible en premier si vous souhaitez éviter de bloquer (retour immédiatement avec
zf code> effacer si une touche est disponible ou défini si non). Voir par exemple ici ou ICI (ou Google" int 16h "pour plus). P>
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?
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
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 code> et
sp code> 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 code>, toute mémoire élevée supérieure à 0x7C00 est bien ou y a-t-il une valeur meilleure plus spécifique?
SS code> à 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 à:
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 / ...