We keren terug naar de reeks tutorials over hoe we ons eigen besturingssysteem kunnen maken. Ik neem aan dat je dit hoofdstuk erg leuk zult vinden, omdat we eindelijk kunnen communiceren met ons besturingssysteem. Vandaag zullen we de toetsenbordinvoer lezen. Hiervoor is het schema vergelijkbaar met dat van de timer. We moeten hoe dan ook IRQ's gebruiken, dus we beginnen hetzelfde als met de timer.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Onze toetsenbordhandler is echter wat complexer omdat we de toetsen lezen en ze in een buffer plaatsen.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
We kunnen controleren hoe we een functie genaamd ND :: Keyboard :: GetChar noemen. Daar krijgen we het karakter en als het geen leeg karakter is (hier heb ik 255 gebruikt, zouden we een beter systeem moeten gebruiken), plaatsen we het karakter op het scherm en slaan het op in een simpele buffer van karakters (dit is ook vatbaar voor verbetering, het huidige systeem kan overlopen).
nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (unsigned char) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {retourneer 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 kunnen we zien hoe de ingedrukte toets wordt verkregen. Bij 0x60 zal altijd de laatste toets zijn ingedrukt. In feite kan het direct worden gelezen zonder de IRQ te hoeven gebruiken, maar dan weten we niet hoe we kunnen vaststellen wanneer er een wijziging heeft plaatsgevonden. Daar controleren we met de AND-bewerking of de code die we hebben verkregen overeenkomt met een sleutel die is vrijgegeven.
In dat geval geven we 255 terug (omdat we het later negeren) en anders is de toets ingedrukt. In dat geval retourneren we de positie van een array genaamd en_US. Welke informatie bevat deze array? Deze array is wat we een keymap of een character map zouden noemen. Zoals u weet, hebben verschillende talen verschillende toetsenborden en worden ze niet ondersteund omdat ze de toetsen overschrijven. Dus en_US geeft ons de sleutel die overeenkomt met elke code en het werkt op een Amerikaans toetsenbord.
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, / * Ctrl * /' a ',' s ',' d ',' f ',' g ', 'h', 'j', 'k', 'l', ';', '\' ',' '', 0, / * Linker Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Rechts verschuiven * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10-toetsen * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Starttoets * / 0, / * Pijl omhoog * / 0, / * Pagina omhoog * / '-', 0, / * Pijl naar links * / 0, 0, / * Pijl naar rechts * / '+', 0, / * Eindetoets * / 0, / * Pijl omlaag * / 0, / * Pagina omlaag * / 0, / * Toets invoegen * / 0, / * Verwijdertoets * / 0,0,0, 0, 0, 11, / * F12-F0 toetsen * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Er was ook een gedefinieerde functie die een zin kreeg. Het doel is simpelweg om gemakkelijker toegang te krijgen tot de strings van de applicaties die het nodig hebben, op dit moment slechts één. Ik heb het over NextShellLite, een gereduceerde versie van de mogelijke toekomstige shell die NextDivel zou hebben. Het doel van NextShellLite is alleen om een verkleinde shell te bieden om geleidelijk nieuwe functionaliteiten te testen. Ik ga de shell-code hier niet plaatsen, maar ik heb deze opgenomen in de NextDivel-code.
Op dit moment werkt het niet als een apart programma maar als een functie die door de kernel wordt aangeroepen, voornamelijk omdat we de optie om executables te draaien nog niet hebben toegevoegd. En natuurlijk enkele foto's van hoe de shell werkt met de nieuwe toetsenbordinvoerfuncties.
uitstekende tutor! bedankt 🙂
De waarheid is dat ik de tutorial nooit heb gevolgd, omdat ik in het eerste deel een fout kreeg bij het compileren, maar ik weet niet meer welke fout het was
Sorry voor mijn grove onwetendheid ... waar zijn deze codes geschreven? Vanaf de terminal ??
De codes maken deel uit van de broncode. Ik zet het niet compleet want anders is de post allemaal code en niets uitleg. Ik raad je aan om de tutorials vanaf het begin te lezen als je deze wilt volgen. Je kunt hier ook de volledige broncode bekijken (http://github.com/AdrianArroyoCalle/next-divel)
Hoe zou de verbetering zijn zodat er geen overstroming optreedt?
Kady, heb je de repositorycode al gecontroleerd? Daar wordt de maximale grootte vastgesteld, evenals functies om deze te besturen, daar kunt u de verandering in grootte aanbrengen of een redelijke manier implementeren om de buffer vrij te maken wanneer deze verzadigd raakt
Ik laat de link achter zodat u deze kunt controleren https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Hallo heel interessant, ga je door met deze «serie» Emuleren Linus Torvals?
Kun je wat boek, informatie aanbevelen om een kernel als deze te kunnen maken?
Groeten!
Hoi. Bedankt voor de tutorial. Kunt u alstublieft een boek hierover aanbevelen dat u heeft gemaakt dat niet "Operating Systems" van Tanenbaum is? Alvast heel erg bedankt.
Groeten.