Posnemanje Linusa Torvaldsa: ustvarite svoj operacijski sistem iz nič (VIII)

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.

NextShellLite


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   dario je dejal

    odličen tutor! hvala 🙂

  2.   PopArch je dejal

    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

  3.   Mačka Lopez je dejal

    Oprostite za mojo nevednost ... od kod so napisane te kode? S terminala ??

    1.    AdrianArroyoStreet je dejal

      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)

  4.   Kady je dejal

    Kako bi bilo izboljšanje, da ne pride do prelivanja?

    1.    Plock je dejal

      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

  5.   Nico je dejal

    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!

  6.   AnswersVegan.Org je dejal

    Ž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.