Vrnemo se k vrsti vadnic o tem, kako ustvariti svoj operacijski sistem. Predvidevam, da vam bo to poglavje zelo všeč, ker lahko končno komuniciramo z našim operacijskim sistemom. Danes bomo prebrali vnos s tipkovnice. Za to je shema podobna shemi časovnika. Vseeno moramo uporabiti IRQ, zato bomo začeli enako kot pri časovniku.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Naš upravljalnik tipkovnice pa je nekoliko bolj zapleten, saj beremo tipke in jih deponiramo v medpomnilnik.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = optična koda; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Preverimo lahko, kako imenujemo funkcijo, imenovano ND :: Keyboard :: GetChar. Tam dobimo znak in nato, če ni prazen znak (tukaj sem uporabil 255, bi morali uporabiti boljši sistem), postavimo znak na zaslon in ga shranimo v preprost medpomnilnik znakov (to je tudi zaradi izboljšanja se lahko trenutni sistem prelije).
nsigned char ND :: Keyboard :: GetChar () {nepodpisana koda za skeniranje char; scancode = (nepodpisani znak) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {vrni en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; vrni stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Tu lahko vidimo, kako dobimo pritisnjeno tipko. Pri 0x60 bo vedno pritisnjena zadnja tipka. Pravzaprav ga je mogoče brati neposredno, ne da bi morali uporabljati IRQ, potem pa ne bomo znali prepoznati, kdaj je prišlo do spremembe. Tam z operacijo AND preverimo, ali pridobljena koda ustreza ključu, ki je bil sproščen.
V tem primeru vrnemo 255 (ker ga bomo pozneje prezrli), sicer pa je bila tipka pritisnjena. V tem primeru vrnemo položaj polja z imenom en_US. Katere informacije vsebuje ta matrika? Ta matrika je tisto, kar bi imenovali zemljevid tipk ali zemljevid znakov. Kot veste, imajo različni jeziki različne tipkovnice in niso podprti, saj prepisujejo tipke. Tako nam bo en_US dal ključ, ki ustreza vsaki kodi, in bo deloval na ameriški tipkovnici.
nepodpisani 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, / * Levi Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Desni premik * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * tipke F1-F10 * / 0, / * Num lock * / 0, / * Zaklepanje pomikanja * / 0, / * Tipka za dom * / 0, / * puščica navzgor * / 0, / * Stran navzgor * / '-', 0, / * puščica levo * / 0, 0, / * puščica desno * / '+', 0, / * tipka za konec * / 0, / * puščica dol * / 0, / * stran navzdol * / 0, / * tipka za vstavljanje * / 0, / * tipka za brisanje * / 0,0,0, 0, 0, 11, / * tipke F12-F0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Obstajala je tudi definirana funkcija, ki je dobila besedno zvezo. Namen je preprosto lažji dostop do nizov iz aplikacij, ki jih trenutno potrebujejo, trenutno samo ene. Govorim o NextShellLite, zmanjšani različici možne prihodnje lupine, ki bi jo imel NextDivel. Namen NextShellLite je le zagotoviti zmanjšano lupino za preskušanje novih funkcionalnosti po malem. Kode lupine ne bom postavil sem, vendar sem jo vključil v kodo NextDivel.
Trenutno ne deluje kot ločen program, temveč kot funkcija, ki jo pokliče jedro, predvsem zato, ker še nismo dodali možnosti za zagon izvršljivih datotek. In seveda nekaj slik, kako lupina deluje z novimi funkcijami vnosa s tipkovnico.
odličen tutor! hvala 🙂
Resnica je, da nisem nikoli sledil vadnici, ker mi je v prvem delu pri poskusu prevajanja prišlo do napake, vendar se ne spomnim, za katero napako je šlo
Oprostite za mojo nevednost ... od kod so napisane te kode? S terminala ??
Kode so del izvorne kode. Ne dajem popolnega, ker je sicer pošta vsa koda in nič pojasnila. Če želite slediti navodilom, priporočam, da jih preberete že od začetka. Celotno izvorno kodo lahko preverite tudi tukaj (http://github.com/AdrianArroyoCalle/next-divel)
Kako bi bilo izboljšanje, da ne pride do prelivanja?
Kady, si že preveril kodo skladišča? Tam je določena največja velikost in funkcije za nadzor, tam lahko spremenite velikost ali uporabite razumen način za sprostitev vmesnega pomnilnika, ko postane nasičen
Povezavo pustim, da jo preverite https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Pozdravljeni, zelo zanimivo, boste nadaljevali s to "serijo" posnemanja Linus Torvals?
Ali lahko priporočite kakšno knjigo z informacijami, da lahko naredite takšno jedro?
Lep pozdrav!
Živjo. Hvala za vadnico. Prosim, ali lahko o tem priporočite knjigo, ki ni "Operacijski sistemi" avtorja Tanenbaum? Najlepša hvala v naprej.
Lep pozdrav.