Linus Torvalds emulieren: Erstellen Sie Ihr eigenes Betriebssystem von Grund auf neu (VIII)

Wir kehren zu der Reihe von Tutorials zurück, in denen erläutert wird, wie Sie unser eigenes Betriebssystem erstellen. Ich nehme an, Sie werden dieses Kapitel sehr mögen, weil wir endlich mit unserem Betriebssystem interagieren können. Heute werden wir die Tastatureingabe lesen. Aus diesem Grund ähnelt das Schema dem des Timers. Wir müssen sowieso IRQs verwenden, damit wir genauso wie mit dem Timer starten.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Unser Tastaturhandler ist jedoch etwas komplexer, da wir die Tasten lesen und in einem Puffer ablegen.

extern "C" void ND_Keyboard_Handler (struct regs * r) {vorzeichenloser char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

Wir können überprüfen, wie wir eine Funktion namens ND :: Keyboard :: GetChar aufrufen. Dort erhalten wir das Zeichen und wenn es kein leeres Zeichen ist (hier habe ich 255 verwendet, müssten wir ein besseres System verwenden), setzen wir das Zeichen auf den Bildschirm und speichern es in einem einfachen Zeichenpuffer (dies ist auch der Fall) anfällig für Verbesserungen, das aktuelle System kann überlaufen).

nsigned char ND :: Keyboard :: GetChar () {vorzeichenloser char scancode; scancode = (vorzeichenloses Zeichen) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }}

http://gist.github.com/2d4f13e0b1a281c66884

Hier können wir sehen, wie die gedrückte Taste erhalten wird. Bei 0x60 wird immer die letzte Taste gedrückt. Tatsächlich kann es direkt gelesen werden, ohne dass der IRQ verwendet werden muss, aber dann wissen wir nicht, wie wir feststellen können, wann eine Änderung aufgetreten ist. Dort prüfen wir mit der UND-Operation, ob der erhaltene Code einem freigegebenen Schlüssel entspricht.

In diesem Fall geben wir 255 zurück (weil wir es später ignorieren werden) und ansonsten wurde die Taste gedrückt. In diesem Fall geben wir die Position eines Arrays mit dem Namen en_US zurück. Welche Informationen enthält dieses Array? Dieses Array wird als Keymap oder Character Map bezeichnet. Wie Sie wissen, haben verschiedene Sprachen unterschiedliche Tastaturen und werden nicht unterstützt, da sie die Tasten überschreiben. En_US gibt uns also die Taste, die jedem Code entspricht, und es funktioniert auf einer amerikanischen Tastatur.

unsigned char en_US [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' i ',' o ',' p ',' [','] ',' \ n ', 0, / * Strg * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' '', 0, / * Linksverschiebung * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Rechtsverschiebung * / '*', 0, / * Alt * / '', 0, / * Feststelltaste * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10-Tasten * / 0, / * Num-Sperre * / 0, / * Bildlaufsperre * / 0, / * Home-Taste * / 0, / * Aufwärtspfeil * / 0, / * Bild aufwärts * / '-', 0, / * Pfeil nach links * / 0, 0, / * Pfeil nach rechts * / '+', 0, / * Endtaste * / 0, / * Abwärtspfeil * / 0, / * Bild ab * / 0, / * Taste einfügen * / 0, / * Taste löschen * / 0,0,0, 0, 0, 11, / * F12-F0-Tasten * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Es gab auch eine definierte Funktion, die eine Phrase bekam. Der Zweck besteht einfach darin, einfacher auf die Zeichenfolgen aus den Anwendungen zuzugreifen, die sie benötigen, im Moment nur eine. Ich spreche von NextShellLite, einer reduzierten Version der möglichen zukünftigen Shell, die NextDivel haben würde. Der Zweck von NextShellLite besteht nur darin, eine reduzierte Shell bereitzustellen, um schrittweise neue Funktionen zu testen. Ich werde den Shell-Code hier nicht einfügen, aber ich habe ihn in den NextDivel-Code aufgenommen.

Im Moment funktioniert es nicht als separates Programm, sondern als vom Kernel aufgerufene Funktion, hauptsächlich weil wir die Option zum Ausführen ausführbarer Dateien noch nicht hinzugefügt haben. Und natürlich einige Bilder, wie die Shell mit den neuen Tastatureingabefunktionen funktioniert.

WeiterShellLite


Als bevorzugte Quelle in Google hinzufügen