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.
suurepärane juhendaja! aitäh 🙂
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
Vabandage mu ränga teadmatuse pärast ... kust need koodid kirjutatakse? Terminalist ??
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)
Kuidas oleks areng nii, et ülevoolu ei tekiks?
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
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!
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.