Ugledanje na Linusa Torvaldsa: stvorite svoj vlastiti operativni sistem od nule (VIII)

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.

NextShellLite


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   dario rekao je

    odličan učitelj! hvala 🙂

  2.   PopArch rekao je

    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č

  3.   Lopezova mačka rekao je

    Žao mi je zbog mog glupog neznanja ... odakle su napisani ovi kodovi? Sa terminala ??

    1.    AdrianArroyoStreet rekao je

      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)

  4.   kady rekao je

    Kako bi bilo poboljšanje da se ne dogodi prelivanje?

    1.    plock rekao je

      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

  5.   Nico rekao je

    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 !!

  6.   AnswersVegan.Org rekao je

    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.