16 Stimmen

Tastaturzugriff im geschützten Modus auf x86-Assembly

Ich arbeite an der Tastatureingabe für einen sehr einfachen Kernel, den ich gerade entwickle, und ich komme nicht weiter. Ich kann scheinbar keine Informationen online finden, die mir die Informationen zeigen, die ich wissen muss.

Mein Kernel läuft im Moment im geschützten Modus, so dass ich die Tastaturroutinen des realen Modus nicht verwenden kann, ohne in den realen Modus und zurück zu springen, was ich zu vermeiden versuche. Ich möchte vom geschützten Modus aus auf meine Tastatur zugreifen können. Weiß jemand, wie man das macht? Das Einzige, was ich bisher gefunden habe, ist, dass man den Controller direkt über die In/Out-Ports ansprechen muss, aber darüber hinaus bin ich ratlos. Dies ist natürlich nicht etwas, das sehr oft auftaucht. Normalerweise gehen Assembly-Tutorials davon aus, dass man ein Betriebssystem darunter laufen hat.

Ich bin sehr neu in der x86-Assembler, so bin ich gerade auf der Suche nach einigen guten Ressourcen für die Arbeit mit der Standard-Hardware von geschützten Modus. Ich kompiliere den Assembler-Quellcode mit NASM und verlinke ihn mit dem C-Quellcode, der mit DJGPP kompiliert wurde. Irgendwelche Vorschläge?

15voto

Adam Rosenfield Punkte 373807

Les MIT-Betriebssystemklasse hat viele gute Referenzen. Besuchen Sie insbesondere Ressourcen von Adam Chapweske zur Programmierung von Tastatur und Maus.

Kurz gesagt, ja, Sie werden die rohen Ein- und Ausgänge verwenden, was erfordert, dass Sie entweder im Kernel-Modus laufen oder die E/A-Erlaubnisbits (IOPL) im EFLAGS-Register gesetzt haben. Siehe diese Seite für weitere Details zu E/A-Berechtigungen.

3voto

CesarB Punkte 41671

Sie arbeiten mit Standard-Legacy-Hardware im echten und im geschützten Modus auf die gleiche Weise. In diesem Fall möchten Sie mit dem 8042 an den I/O-Ports 0x60 bis 0x6f kommunizieren, der wiederum mit dem Controller in der Tastatur am anderen Ende der Leitung kommuniziert.

Bei einer schnellen Google-Suche fand ich eine interessante Quelle unter http://heim.ifi.uio.no/~stanisls/helppc/8042.html (für den 8042) und http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (für die Tastatur).

Falls Sie es nicht gewohnt sind, kommunizieren Sie mit Komponenten an E/A-Ports über die Opcodes IN (Lesen) und OUT (Schreiben), die die Nummer des E/A-Ports (ein 16-Bit-Wert) und den zu lesenden oder zu schreibenden Wert (entweder 8, 16 oder 32 Bit) erhalten. Beachten Sie, dass die Größe, die gelesen oder geschrieben wird, wichtig ist! Das Schreiben von 16 Bits in etwas, das 8 Bits erwartet (oder umgekehrt), ist ein Rezept für eine Katastrophe. Gewöhnen Sie sich an diese Opcodes, da Sie sie häufig verwenden werden (es ist die einzige Möglichkeit, mit einigen Peripheriegeräten zu kommunizieren, einschließlich einiger wichtiger Peripheriegeräte; andere Peripheriegeräte verwenden memory-mapped I/O (MMIO) oder bus-mastering DMA).

1voto

Les 8042 PS/2-Steuerung scheint die einfachste Möglichkeit zu sein.

Das oszur11 OS-Tutorial enthält ein Arbeitsbeispiel unter https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Einfach:

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 reproduzieren es hier, weil der Code es zu lang, wird aktualisiert, wenn es mir gelingt, die Tastatur Teil in einem minimalen Beispiel zu isolieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X