Lino Torvaldso mėgdžiojimas: sukurkite savo operacinę sistemą nuo nulio (VIII)

Grįžtame prie vadovėlių, kaip susikurti savo operacinę sistemą, serijos. Manau, šis skyrius jums labai patiks, nes mes pagaliau galime bendrauti su savo operacine sistema. Šiandien mes perskaitysime klaviatūros įvestį. Tam schema yra panaši į laikmačio schemą. Mes vis tiek turime naudoti IRQ, todėl pradėsime tą patį, ką ir su laikmačiu.

„ND_IRQ_InstallHandler“ (1, & ND_Keyboard_Handler);

Tačiau mūsų klaviatūros tvarkytuvas yra šiek tiek sudėtingesnis, nes mes skaitome raktus ir dedame juos į buferį.

išorinis "C" negalioja ND_Keyboard_Handler (struct regs * r) {nepasirašytas char scancode = ND :: Klaviatūra :: GetChar (); if (scancode! = 255) {ND :: Ekranas :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

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

Mes galime patikrinti, kaip mes vadiname funkciją, vadinamą ND :: Keyboard :: GetChar. Čia mes gauname simbolį ir tada, jei jis nėra tuščias simbolis (čia aš naudojau 255, turėtume naudoti geresnę sistemą), mes įdėjome simbolį į ekraną ir laikome jį paprastame simbolių buferyje (tai taip pat yra gali būti perpildyta).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (nepasirašyta char) ND :: Uostai :: InputB (0x60); jei (scancode & ND_KEYBOARD_KEY_RELEASE) {grąžinti 255; } else {return en_US [scancode]; }} char * ND :: Klaviatūra :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; grąžinti stringBuffer; }

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

Čia galime pamatyti, kaip gaunamas paspaustas klavišas. Esant 0x60, visada bus paspaustas paskutinis mygtukas. Tiesą sakant, jį galima perskaityti tiesiogiai nenaudojant IRQ, bet tada mes nežinome, kaip nustatyti, kada įvyko pakeitimas. Ten operacija AND patikriname, ar gautas kodas atitinka raktą, kuris buvo išleistas.

Tokiu atveju grąžiname 255 (nes vėliau to nepaisysime), o kitu atveju raktas buvo paspaustas. Tokiu atveju grąžiname masyvo, vadinamo en_US, poziciją. Kokios informacijos yra šiame masyve? Šį masyvą mes pavadintume klavišų schema arba simbolių žemėlapiu. Kaip žinote, skirtingos kalbos turi skirtingas klaviatūras ir nėra palaikomos, nes jos perrašo klavišus. Taigi „en_US“ suteiks raktą, atitinkantį kiekvieną kodą, ir jis veiks amerikietiška klaviatūra.

nepasirašyta simbolis 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, / * kairysis poslinkis * / '\\', 'z', 'x', „c“, „v“, „b“, „n“, „m“, „,“, „.“, „/“, 0, / * Dešinysis poslinkis * / '*', 0, / * Alt * / '', 0, / * Didžiosios raidės užraktas * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 klavišai * / 0, / * Num lock * / 0, / * Slinkties užraktas * / 0, / * Pagrindinis mygtukas * / 0, / * Rodyklė aukštyn * / 0, / * Puslapio aukštyn * / '-', 0, / * Kairė rodyklė * / 0, 0, / * Rodyklė dešinėn * / '+', 0, / * Pabaigos klavišas * / 0, / * Rodyklė žemyn * / 0, / * Puslapis žemyn * / 0, / * Įterpti klavišą * / 0, / * Trinti klavišą * / 0,0,0, 0, 0, 11, / * F12-F0 klavišai * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Taip pat buvo apibrėžta funkcija, kuri gavo frazę. Tikslas yra paprasčiau pasiekti eilutes iš programų, kurioms to reikia, šiuo metu tik viena. Aš kalbu apie „NextShellLite“, sumažintą galimo būsimo apvalkalo versiją, kurią turėtų „NextDivel“. „NextShellLite“ tikslas yra tik suteikti sumažintą apvalkalą, kad palaipsniui būtų galima išbandyti naujas funkcijas. Aš nesiruošiu įdėti „shell“ kodo čia, bet įtraukiau jį į „NextDivel“ kodą.

Šiuo metu ji veikia ne kaip atskira programa, bet kaip funkcija, kurią vadina branduolys, daugiausia todėl, kad dar nepridėjome galimybės paleisti vykdomųjų failų. Ir, žinoma, keletas nuotraukų, kaip apvalkalas veikia su naujomis klaviatūros įvesties funkcijomis.

„NextShellLite“


Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.

  1.   Daryo sakė

    puikus auklėtojas! ačiū 🙂

  2.   PopArchas sakė

    Tiesa, aš niekada nesilaikiau mokymo programos, nes pirmoje dalyje man davė klaidą bandant sudaryti, bet aš nepamenu, kokia tai buvo klaida

  3.   Lopezo katė sakė

    Atsiprašau už savo žiaurų nežinojimą ... iš kur parašyti šie kodai? Iš terminalo ??

    1.    AdrianArroyo gatvė sakė

      Kodai yra pirminio kodo dalis. Aš nepateikiu jo pilno, nes kitaip įrašas yra visas kodas ir nieko nepaaiškina. Jei norite jų laikytis, rekomenduoju nuo pat pradžių perskaityti vadovėlius. Čia taip pat galite patikrinti visą šaltinio kodą (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady sakė

    Kaip būtų tobulėti, kad neatsirastų perpildymo?

    1.    Plockas sakė

      Kady, ar jau patikrinote saugyklos kodą? Yra nustatytas maksimalus dydis ir funkcijos jį valdyti. Čia galite pakeisti dydį arba įgyvendinti pagrįstą būdą atlaisvinti buferį, kai jis bus prisotintas
      Palieku jums nuorodą, kad ją patikrintumėte https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   nico sakė

    Sveiki, labai įdomu, ar tęsite šią „Linus Torvals“ mėgdžiojimo „seriją“?
    Ar galėtumėte rekomenduoti knygą, informaciją, kad būtų galima sukurti tokį branduolį?

    Sveiki atvykę!

  6.   AtsakymaiVeganas.Org sakė

    Sveiki. Ačiū už pamoką. Prašau, gal galėtumėte rekomenduoti savo parašytą knygą, kuri nėra Tanenbaumo „Operacinės sistemos“? Labai aciu is anksto.
    Sveikinimai.