2008-10-20 9 views
13

Ich arbeite an der Tastatureingabe für einen sehr grundlegenden Kernel, den ich entwickle, und ich bin völlig festgefahren. Ich kann anscheinend keine Informationen online finden, die mir die Informationen zeigen können, die ich wissen muss.Geschützter Modus Tastaturzugriff auf x86 Assembly

Mein Kernel läuft jetzt im geschützten Modus, so dass ich die Real-Modus-Tastaturroutinen nicht verwenden kann, ohne in den Real-Modus und zurück zu springen, was ich zu vermeiden versuche. Ich möchte im geschützten Modus auf meine Tastatur zugreifen können. Weiß jemand, wie man das macht? Das Einzige, was ich bisher gefunden habe, ist, dass ich mit dem Controller direkt über Ein-/Aus-Ports sprechen muss, aber darüber hinaus bin ich ratlos. Das kommt natürlich nicht oft vor. Normalerweise gehen Assembly-Tutorials davon aus, dass Sie ein Betriebssystem darunter ausführen.

Ich bin sehr neu in der x86-Assembly, also bin ich nur auf der Suche nach ein paar gute Ressourcen für die Arbeit mit der Standard-Hardware aus dem geschützten Modus. Ich kompiliere den Assembly-Quellcode mit NASM und verknüpfe ihn mit dem C-Quellcode, der mit DJGPP kompiliert wurde. Irgendwelche Vorschläge?

+0

Hallo, ich weiß, das ist eine alte Frage, aber können Sie Ihre Frage mit der Lösung bearbeiten, oder werfen Sie einen Blick auf meine Frage http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- eigener-kernel-c? Danke –

Antwort

12

Die MIT operating systems class hat viele gute Referenzen. Überprüfen Sie insbesondere Adam Chapweske's resources auf Tastatur und Maus Programmierung.

Kurz gesagt, Sie verwenden die Raw In/Out Ports, die entweder im Kernel-Modus ausgeführt werden müssen oder die E/A-Berechtigungsbits (IOPL) im EFLAGS-Register haben müssen. Weitere Informationen zu E/A-Berechtigungen finden Sie unter this page.

+1

Yay !!!Ich habe es dank dieser Seiten zum Laufen gebracht. Du bist unglaublich, und ich würde dich 10 mal abstimmen, wenn ich könnte. Jetzt muss ich nur die Scan-Codes in ASCII umwandeln, aber das kann ich wahrscheinlich tun (und außerdem, dass es die Scancodes auf den Bildschirm ausgibt, sieht wirklich ordentlich aus!) Vielen Dank! –

+1

Sehr nützlich! –

+0

MIT link dead, wahrscheinlich aktualisiert auf: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-828-operating-system-engineering-fall-2012/ –

3

Sie arbeiten mit Standard-Legacy-Hardware auf die gleiche Weise auf realen und geschützten Modi. In diesem Fall möchten Sie mit dem 8042 über die I/O-Ports 0x60 bis 0x6f sprechen, die wiederum mit dem Controller in der Tastatur am anderen Ende der Leitung kommunizieren. Eine schnelle Google-Suche fand mich eine interessante Ressource bei http://heim.ifi.uio.no/~stanisls/helppc/8042.html (für die 8042) und http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (für die Tastatur).

Wenn Sie nicht daran gewöhnt sind, sprechen Sie mit Komponenten an I/O-Ports über die IN (lesen) und OUT (schreiben) Opcodes, die die E/A-Port-Nummer (ein 16-Bit-Wert) erhalten und der Wert, der gelesen oder geschrieben werden soll (entweder 8, 16 oder 32 Bits). Beachten Sie, dass die gelesene oder geschriebene Größe wichtig ist! Schreiben von 16 Bits auf etwas, das 8 Bits erwartet (oder umgekehrt) ist ein Rezept für eine Katastrophe. Gewöhnen Sie sich an diese Opcodes, da Sie sie sehr oft verwenden werden (es ist die einzige Möglichkeit, mit einigen Peripheriegeräten zu kommunizieren, darunter einige wichtige; andere Peripheriegeräte verwenden speicherprogrammierte E/A (MMIO) oder Bus-Mastering-DMA).

+0

Das sind gute Informationen Allerdings musste ich mit den Ports 0x60 und ox64 sprechen, nicht mit 0x6F. Die ganze Dokumentation scheint auch so zu zeigen. Vielleicht ein Tippfehler? –

+0

Es sind Ports 0x60 _to_ 0x6f (siehe/proc/ioports auf jedem x86 Linux-Rechner). Von diesen werden 0x60 und 0x64 tatsächlich verwendet. – CesarB

+0

Links tot, aber Wayback Maschine hat sie: https://web.archive.org/web/20150503041658/http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html –

0

Der 8042 PS/2 Controller sieht wie die einfachste Möglichkeit aus.

Die oszur11 O Tutorial enthält ein funktionierendes Beispiel unter https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Nur:

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 

Getestet auf Ubuntu 14.04 AMD64.

Mein GitHub Spiegel (Upstream inaktiv): https://github.com/cirosantilli/oszur11-operating-system-examples

Nicht hier reproduzieren, da der Code es zu lange, wird aktualisiert, wenn ich auf die Tastatur in einem minimalen Beispiel verwalten zu isolieren.

Verwandte Themen