Vraćamo se na niz vodiča o tome kako stvoriti vlastiti operativni sistem. Pretpostavljam da će vam se ovo poglavlje jako svidjeti jer konačno možemo komunicirati s našim operativnim sistemom. Danas ćemo pročitati unos sa tastature. Za to je shema slična tajmeru. Ionako moramo koristiti IRQ-ove, pa ćemo započeti isto kao kod tajmera.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
Naš rukovatelj tipkovnicom je, međutim, nešto složeniji jer čitamo tipke i stavljamo ih u međuspremnik.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = kod za skeniranje; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Možemo provjeriti kako zovemo funkciju koja se zove ND :: Keyboard :: GetChar. Tamo dobivamo znak i onda ako nije prazan znak (ovdje sam koristio 255, morali bismo koristiti bolji sistem) stavimo lik na ekran i spremimo ga u jednostavan međuspremnik znakova (ovo je također podložno poboljšanju, trenutni sistem se može preliti).
nsigned char ND :: Keyboard :: GetChar () {nepotpisani char scan code; scancode = (nepotpisani znak) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {povratak en_US [scancode]; }} char * ND :: Tastatura :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Ovdje možemo vidjeti kako se dobiva tipka koja je pritisnuta. Na 0x60 će uvijek biti zadnji pritisnuti taster. Zapravo se može čitati direktno bez potrebe za korištenjem IRQ-a, ali tada nećemo znati kako prepoznati kada je došlo do promjene. Tamo provjeravamo operacijom AND da li kod koji smo dobili odgovara ključu koji je objavljen.
U tom slučaju vraćamo 255 (jer ćemo to kasnije ignorirati), a inače je tipka pritisnuta. U tom slučaju vraćamo položaj niza zvanog en_US. Koje informacije sadrži ovaj niz? Ovaj niz bismo nazvali mapom tipki ili mapom znakova. Kao što ćete znati, različiti jezici imaju različite tastature i nisu podržani jer prepisuju tipke. Dakle, en_US će nam dati ključ koji odgovara svakom kodu i on će raditi na američkoj tastaturi.
nepotpisani char 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, / * lijevi pomak * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Desni pomak * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 tipke * / 0, / * Num lock * / 0, / * Zaključavanje pomicanja * / 0, / * Tipka Početna * / 0, / * Strelica prema gore * / 0, / * Stranica gore * / '-', 0, / * Strelica ulijevo * / 0, 0, / * Strelica udesno * / '+', 0, / * Tipka za završetak * / 0, / * Strelica prema dolje * / 0, / * Stranica prema dolje * / 0, / * Tipka za umetanje * / 0, / * Tipka za brisanje * / 0,0,0, 0, 0, 11, / * tasteri F12-F0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Postojala je i definirana funkcija koja je dobila frazu. Svrha je jednostavno pristupiti stringovima iz aplikacija kojima je to potrebno, trenutno samo jednoj. Govorim o NextShellLite, smanjenoj verziji moguće buduće ljuske koju bi NextDivel imao. Svrha NextShellLite-a je samo pružanje smanjene ljuske za testiranje novih funkcionalnosti malo po malo. Neću ovdje stavljati shell kod, ali sam ga uključio u NextDivel kod.
Trenutno ne radi kao zasebni program, već kao funkcija koju poziva jezgro, uglavnom zato što još nismo dodali opciju za pokretanje izvršnih datoteka. I naravno, nekoliko slika kako ljuska radi s novim funkcijama za unos tastature.
odličan učitelj! hvala 🙂
Istina je da nikada nisam slijedio tutorijal jer mi je u prvom dijelu dao grešku prilikom pokušaja kompajliranja, ali ne sjećam se o kojoj je grešci riječ
Žao mi je zbog mog glupog neznanja ... odakle su napisani ovi kodovi? Sa terminala ??
Kodovi su dio izvornog koda. Ne stavljam ga u potpunosti jer je u suprotnom pošta sav kod i nema objašnjenja. Preporučujem da uputstva pročitate od početka ako ih želite slijediti. Pun izvorni kod takođe možete provjeriti ovdje (http://github.com/AdrianArroyoCalle/next-divel)
Kako bi bilo poboljšanje da se ne dogodi prelivanje?
Kady, jesi li već provjerila kod spremišta? Tamo je utvrđena maksimalna veličina, kao i funkcije za kontrolu, tamo možete izvršiti promjenu veličine ili primijeniti razuman način za oslobađanje međuspremnika kada postane zasićen
Ostavljam vam vezu da biste je provjerili https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Pozdrav, vrlo zanimljivo, hoćete li nastaviti s ovom «serijom» oponašanja Linus Torvals-a?
Možete li preporučiti neku knjigu i informacije kako biste mogli napraviti ovakav kernel?
Saludos !!
Zdravo. Hvala na lekciji. Molim vas, možete li preporučiti knjigu o ovome koju ste napravili i koja nije "Operativni sistemi" kompanije Tanenbaum? Hvala vam unaprijed.
Pozdrav.