Ons keer terug na die reeks tutoriale oor hoe om ons eie bedryfstelsel te skep. Ek veronderstel dat u baie van hierdie hoofstuk sal hou, want ons kan uiteindelik met ons bedryfstelsel in wisselwerking tree. Vandag sal ons die sleutelbordinvoer lees. Hiervoor is die skema soortgelyk aan die van die timer. Ons moet in elk geval IRQ's gebruik, sodat ons dieselfde sal begin as met die timer.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Ons sleutelbordhanteerder is egter ietwat ingewikkelder omdat ons die sleutels lees en in 'n buffer neersit.
extern "C" nietig 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
Ons kan kyk hoe ons 'n funksie met die naam ND :: Keyboard :: GetChar noem. Daar kry ons die karakter en as dit dan nie 'n leë karakter is nie (hier het ek 255 gebruik, sal ons 'n beter stelsel moet gebruik) plaas ons die karakter op die skerm en stoor dit in 'n eenvoudige buffer van karakters (dit is ook onderhewig aan verbetering, die huidige stelsel kan oorloop).
nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (ongetekende char) ND :: poorte :: InputB (0x60); as (scancode & ND_KEYBOARD_KEY_RELEASE) {terugkeer 255; } anders {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; retour stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Hier kan ons sien hoe die ingedrukte sleutel verkry word. By 0x60 sal daar altyd die laaste toets gedruk word. In werklikheid kan dit direk gelees word sonder om die IRQ te gebruik, maar dan sal ons nie weet hoe om te identifiseer wanneer 'n verandering plaasgevind het nie. Daar gaan ons na met die EN-bewerking dat die kode wat ons verkry het, ooreenstem met 'n sleutel wat vrygestel is.
In daardie geval stuur ons 255 terug (omdat ons dit later sal ignoreer) en anders is die sleutel gedruk. In daardie geval gee ons die posisie terug van 'n skikking genaamd en_US. Watter inligting bevat hierdie skikking? Hierdie skikking is wat ons 'n sleutelkaart of 'n karakterkaart sal noem. Soos u sal weet, het verskillende tale verskillende sleutelborde en word dit nie ondersteun nie omdat dit die sleutels oorskryf. Dus sal en_US ons die sleutel gee wat ooreenstem met elke kode en dit sal op 'n Amerikaanse sleutelbord werk.
ongetekende 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, / * Left Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n ',' m ',', ','. ',' / ', 0, / * Regs skuif * /' * ', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 sleutels * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Home key * / 0, / * Up arrow * / 0, / * Page up * / '-', 0, / * Left arrow * / 0, 0, / * Right arrow * / '+', 0, / * Eindtoets * / 0, / * Pijltjie-onder * / 0, / * Bladsy af * / 0, / * Voeg sleutel in * / 0, / * Skrap sleutel * / 0,0,0, 0, 0, 11, / * F12-F0 sleutels * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Daar was ook 'n gedefinieerde funksie wat 'n frase gekry het. Die doel is om makliker toegang te verkry tot die snare uit die toepassings wat dit benodig, op die oomblik slegs een. Ek praat van NextShellLite, 'n verkleinde weergawe van die moontlike toekomstige dop wat NextDivel sou hê. Die doel van NextShellLite is slegs om 'n verminderde dop te bied om geleidelik nuwe funksies te toets. Ek gaan nie die dopkode hier plaas nie, maar ek het dit in die NextDivel-kode opgeneem.
Op die oomblik werk dit nie as 'n aparte program nie, maar as 'n funksie wat deur die kern genoem word, hoofsaaklik omdat ons nog nie die opsie gevoeg het om uitvoerbare programme uit te voer nie. En natuurlik 'n paar foto's van hoe die dop werk met die nuwe sleutelbordinvoerfunksies.
8 kommentaar, los joune
uitstekende tutor! dankie 🙂
Die waarheid is dat ek nooit die tutoriaal gevolg het nie, want dit het my in die eerste deel 'n fout gegee toe ek probeer saamstel, maar ek weet nie watter fout dit was nie
Jammer vir my groot onkunde ... van waar is hierdie kodes geskryf? Van die terminale af ??
Die kodes is deel van die bronkode. Ek stel dit nie volledig nie, want anders is die boodskap alles kode en niks verduidelik nie. Ek beveel aan dat u die tutoriale van die begin af lees as u dit wil volg. U kan ook die volledige bronkode hier nagaan (http://github.com/AdrianArroyoCalle/next-divel)
Hoe sou die verbetering wees sodat oorloop nie plaasvind nie?
Kady, het jy al die bewaarplek-kode nagegaan? Daar is die maksimum grootte vasgestel, asook funksies om dit te beheer, daar kan u die grootte verander of 'n redelike manier implementeer om die buffer vry te maak as dit versadig raak
Ek los die skakel vir u om dit na te gaan https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Hallo baie interessant, gaan u voortgaan met hierdie «reeks» van Emulating Linus Torvals?
Kan u een of ander boek aanbeveel om 'n kern soos hierdie te kan maak?
Groete!
Hi. Dankie vir die tutoriaal. Kan u asseblief 'n boek hieroor aanbeveel wat u gemaak het wat nie 'Operating Systems' van Tanenbaum is nie? Baie dankie by voorbaat.
Groete.