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


Lisa eelistatud allikana Google'is