Oponašanje Linusa Torvaldsa: stvorite vlastiti operativni sustav od nule (VIII)

Vraćamo se na niz vodiča o tome kako stvoriti vlastiti operativni sustav. Pretpostavljam da će vam se ovo poglavlje jako svidjeti jer napokon možemo komunicirati s našim operativnim sustavom. Danas ćemo pročitati unos s tipkovnice. Zbog toga je shema slična onoj s mjeračem vremena. Ionako moramo koristiti IRQ-ove, pa ćemo započeti isto kao kod tajmera.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Naš je rukovatelj tipkovnicom, međutim, nešto složeniji jer čitamo tipke i polažemo 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 naziva ND :: Keyboard :: GetChar. Tamo dobivamo znak i onda ako nije prazan znak (ovdje sam upotrijebio 255, morali bismo koristiti bolji sustav) stavimo lik na zaslon i pohranimo ga u jednostavan međuspremnik znakova (to je također predmet poboljšanja, trenutni sustav može se 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 :: Tipkovnica :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; vratiti stringBuffer; }

http://gist.github.com/2d4f13e0b1a281c66884

Ovdje možemo vidjeti kako se dobiva tipka koja je pritisnuta. Na 0x60 uvijek će biti pritisnuta zadnja tipka. Zapravo se može čitati izravno 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 podatke sadrži ovaj niz? Ovaj je niz ono što bismo nazvali mapom tipki ili mapom znakova. Kao što ćete znati, različiti jezici imaju različite tipkovnice i nisu podržani jer prepisuju tipke. Tako će nam en_US dati ključ koji odgovara svakom kodu i on će raditi na američkoj tipkovnici.

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 prema 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, / * F12-F0 tipke * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Također je bila definirana funkcija koja je dobila frazu. Svrha je jednostavno olakšati pristup 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 postupno testiranje novih značajki. Neću ovdje stavljati ljuski, ali sam ga uključio u kod NextDivel.

Trenutno ne radi kao zasebni program, već kao funkcija koju poziva jezgra, uglavnom zato što još nismo dodali mogućnost pokretanja izvršnih datoteka. I naravno, nekoliko slika kako ljuska radi s novim funkcijama za unos tipkovnice.

NextShellLite


Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  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 obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   dario dijo

    izvrstan učitelj! hvala 🙂

  2.   PopArch dijo

    Istina je da nikada nisam slijedio tutorial jer mi je u prvom dijelu donio pogrešku pri pokušaju kompajliranja, ali ne sjećam se o kojoj se grešci radi

  3.   Lopezova mačka dijo

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

    1.    AdrianArroyoStreet dijo

      Kodovi su dio izvornog koda. Ne stavljam ga kompletno jer je u suprotnom pošta sav kôd i nema objašnjenja. Preporučujem vam da uputstva pročitate od početka ako ih želite slijediti. Puni izvorni kod također možete provjeriti ovdje (http://github.com/AdrianArroyoCalle/next-divel)

  4.   kady dijo

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

    1.    Plock dijo

      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 vezu da biste je provjerili https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico dijo

    Pozdrav, vrlo zanimljivo, hoćeš li nastaviti s ovom «serijom» oponašanja Linusa Torvalsa?
    Možete li preporučiti bilo koju knjigu i informacije kako biste mogli napraviti ovakvu jezgru?

    Pozdrav!

  6.   OdgovoriVeganas.Org dijo

    Bok. Hvala na lekciji. Molim vas, možete li preporučiti knjigu o tome koju ste napravili i koja nije "Operativni sustavi" tvrtke Tanenbaum? Unaprijed puno hvala.
    Pozdrav.