Question

Je travaille sur la saisie au clavier d'un noyau très basique que je développe et que je suis complètement bloqué. Il semble que je ne trouve aucune information en ligne qui puisse me montrer les informations dont j'ai besoin de savoir.

Mon noyau fonctionne actuellement en mode protégé. Je ne peux donc pas utiliser les routines de clavier en mode réel sans passer en mode réel et inversement, ce que j'essaie d'éviter. Je veux pouvoir accéder à mon clavier en mode protégé. Est-ce que quelqu'un sait comment faire ça? La seule chose que j'ai trouvée jusqu'à présent est que cela implique de parler directement au contrôleur via des ports d'entrée / sortie, mais au-delà, je suis perplexe. Bien entendu, ce n'est pas quelque chose qui revient souvent. Normalement, les tutoriels sur l’assemblage supposent que vous utilisez un système d’exploitation en dessous.

Comme je suis très novice dans l'assemblage x86, je cherche simplement de bonnes ressources pour travailler avec le matériel standard en mode protégé. Je compile le code source de Assembly avec NASM et le relie au code source C compilé avec DJGPP. Des suggestions?

Était-ce utile?

La solution

La classe des systèmes d'exploitation MIT contient de très bonnes références. En particulier, consultez les ressources d'Adam Chapweske sur la programmation au clavier et à la souris.

En bref, oui, vous utiliserez les ports raw in / out, qui nécessitent une exécution en mode noyau ou la définition des bits d’autorisation d’entrée / sortie (IOPL) dans le registre EFLAGS. Voir cette page pour plus de détails sur les autorisations d'E / S .

Autres conseils

Vous travaillez avec le matériel hérité standard de la même manière sur les modes réel et protégé. Dans ce cas, vous souhaitez parler avec le 8042 sur les ports d’entrée / sortie 0x60 à 0x6f, qui à leur tour dialogueront avec le contrôleur situé à l’autre extrémité du clavier.

Une recherche rapide dans Google m'a trouvé une ressource intéressante sur http: // heim.ifi.uio.no/~stanisls/helppc/8042.html (pour le 8042) et http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (pour le clavier).

Si vous n’êtes pas habitué, vous communiquez avec des composants situés au niveau des ports d’E / S via les opcodes IN (lecture) et OUT (écriture), qui reçoivent le numéro du port d’E / S (valeur 16 bits) et la valeur à lire ou à écrire (8, 16 ou 32 bits). Notez que la taille lue ou écrite est importante! Écrire 16 bits sur quelque chose qui attend 8 bits (ou vice versa) est une recette pour un désastre. Habituez-vous à ces opcodes, car vous les utiliserez beaucoup (c’est le seul moyen de communiquer avec certains périphériques, y compris plusieurs périphériques essentiels; d’autres utilisent une MMIO mappée en mémoire (MMIO) ou un DMA à bus maîtrisé).

Le contrôleur 8042 PS / 2 ressemble à la possibilité la plus simple.

Le tutoriel OS OS11 contient un exemple de travail sous https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Juste:

sudo apt-get install build-essential qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
git clone git://git.code.sf.net/p/oszur11/code oszur11
cd oszur11/Chapter_06_Shell/04_Makepp
make qemu

Testé sur Ubuntu 14.04 AMD64.

Mon miroir GitHub (inactif en amont): https://github.com/cirosantilli/ oszur11-operating-system-examples

Ne pas le reproduire ici parce que le code est trop long, sera mis à jour si je parviens à isoler la partie clavier dans un exemple minimal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top