Linus Torvaldsi jäljendamine: looge oma operatsioonisüsteem nullist (VIII)

Naaseme õpetuste sarja juurde, kuidas oma opsüsteemi luua. Oletan, et see peatükk meeldib teile väga, sest saame lõpuks oma opsüsteemiga suhelda. Täna loeme klaviatuuri sisestust. Selle jaoks on skeem taimeriga sarnane. IRQ-sid peame kasutama niikuinii, nii et alustame samamoodi nagu taimeriga.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Meie klaviatuurihaldur on aga mõnevõrra keerulisem, kuna loeme võtmeid ja hoiame neid puhvris.

väline "C" tühine ND_Keyboard_Handler (struct regs * r) {märkimata char scancode = ND :: Klaviatuur :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

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

Saame kontrollida, kuidas kutsume funktsiooni nimega ND :: Keyboard :: GetChar. Seal saame märgi ja siis, kui see pole tühi märk (siin olen kasutanud 255, peaksime kasutama paremat süsteemi), paneme märgi ekraanile ja salvestame lihtsasse tähemärkide puhvrisse (see on ka täiustamisel võib praegune süsteem üle voolata).

allkirjastamata char ND :: Klaviatuur :: GetChar () {märkimata char scancode; scancode = (märkimata char) ND :: Pordid :: SisendB (0x60); kui (scancode & ND_KEYBOARD_KEY_RELEASE) {tagastab 255; } else {return en_US [scancode]; }} char * ND :: Klaviatuur :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; tagastage stringBuffer; }

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

Siin näeme, kuidas saadakse vajutatud klahv. 0x60 juures on alati viimane klahv. Tegelikult saab seda lugeda otse ilma IRQ-d kasutamata, kuid siis ei tea me, kuidas muutuse toimumist tuvastada. Seal kontrollime operatsiooniga AND, et saadud kood vastab vabastatud võtmele.

Sellisel juhul tagastame 255 (sest me ignoreerime seda hiljem) ja muidu on klahvi vajutatud. Sel juhul tagastame massiivi nimega en_US. Millist teavet see massiiv sisaldab? Seda massiivi nimetaksime võtmekaardiks või märgikaardiks. Nagu teate, on erinevatel keeltel erinevad klaviatuurid ja neid ei toetata, kuna need kirjutavad klahvid üle. Seega annab en_US meile igale koodile vastava võtme ja see töötab Ameerika klaviatuuril.

allkirjastamata täht et_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, / * vasakpoolne nihe * /' \\ ',' z ',' x ', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Parempoolne nihe * / '*', 0, / * Alt * / '', 0, / * suurtähelukk * / 0,0,0,0,0,0,0,0,0,0, / * klahvid F1-F10 * / 0, / * numbrilukk * / 0, / * Kerimislukk * / 0, / * Koduklahv * / 0, / * Ülesnool * / 0, / * Lehekülg üles * / '-', 0, / * Nool vasakule * / 0, 0, / * Nool paremale * / '+', 0, / * lõpetamisklahv * / 0, / * allanool * / 0, / * leht alla * / 0, / * sisestusklahv * / 0, / * kustutusklahv * / 0,0,0, 0, 0, 11, / * F12-F0 klahvid * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Seal oli ka määratletud funktsioon, mis sai fraasi. Eesmärk on lihtsalt hõlpsamini juurde pääseda seda vajavate rakenduste stringidele, hetkel ainult ühele. Ma räägin NextShellLite'ist, vähendatud versioonist võimalikust tulevasest kestast, mis NextDivelil oleks. NextShellLite'i eesmärk on pakkuda ainult vähendatud kestu uute funktsioonide järkjärguliseks testimiseks. Ma ei hakka shellikoodi siia panema, kuid olen selle lisanud NextDivel koodi.

Praegu ei tööta see eraldi programmina, vaid funktsioonina, mida kernel kutsub, peamiselt seetõttu, et me pole veel käivitatavate failide käivitamise võimalust lisanud. Ja muidugi mõned pildid sellest, kuidas kest töötab koos uute klaviatuurisisestusfunktsioonidega.

NextShellLite


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   Dario DIJO

    suurepärane juhendaja! aitäh 🙂

  2.   PopArch DIJO

    Tõsi on see, et ma ei järginud õpetust kunagi, sest esimeses osas andis see mulle kompileerimisel vea, kuid ma ei mäleta, mis viga see oli

  3.   Lopezi kass DIJO

    Vabandage mu ränga teadmatuse pärast ... kust need koodid kirjutatakse? Terminalist ??

    1.    AdrianArroyo tänav DIJO

      Koodid on osa lähtekoodist. Ma ei pane seda lõpule, sest muidu on postitus kogu kood ja mitte midagi selgitust. Kui soovite seda järgida, soovitan teil lugeda õpetusi algusest peale. Siin saate kontrollida ka täielikku lähtekoodi (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady DIJO

    Kuidas oleks areng nii, et ülevoolu ei tekiks?

    1.    Plock DIJO

      Kady, kas olete hoidla koodi juba kontrollinud? Seal on kehtestatud maksimaalne suurus ja funktsioonid selle juhtimiseks. Seal saate muuta suurust või rakendada mõistlikku viisi puhvri vabastamiseks, kui see küllastub
      Jätan lingi teile kontrollimiseks https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico DIJO

    Tere, väga huvitav, kas jätkate selle "Linus Torvalsi jäljendamise" sarjaga?
    Kas saaksite soovitada mõnda raamatut ja teavet, et saaksite sellist kernelit teha?

    Tervitused!

  6.   Vastused Veganid.Org DIJO

    Tere. Täname õpetuse eest. Palun, kas saaksite soovitada selle kohta oma tehtud raamatut, mis pole Tanenbaumi "Operatsioonisüsteemid"? Tänan teid väga ette.
    Tervitused.