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.
puikus auklėtojas! ačiū 🙂
Tiesa, aš niekada nesilaikiau mokymo programos, nes pirmoje dalyje man davė klaidą bandant sudaryti, bet aš nepamenu, kokia tai buvo klaida
Atsiprašau už savo žiaurų nežinojimą ... iš kur parašyti šie kodai? Iš terminalo ??
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)
Kaip būtų tobulėti, kad neatsirastų perpildymo?
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
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ę!
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.