Efterligne Linus Torvalds: Opret dit eget operativsystem fra bunden (VIII)

Vi vender tilbage til serien af ​​tutorials om, hvordan vi opretter vores eget operativsystem. Jeg formoder, at du kan lide dette kapitel meget, fordi vi endelig kan interagere med vores operativsystem. I dag læser vi tastaturindgangen. Til dette svarer ordningen til timeren. Vi skal alligevel bruge IRQ'er, så vi starter det samme som med timeren.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Vores tastaturhåndterer er dog noget mere kompleks, da vi læser tasterne og deponerer dem i en buffer.

ekstern "C" ugyldig ND_Keyboard_Handler (struct regs * r) {usigneret char scancode = ND :: Keyboard :: GetChar (); hvis (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

http://gist.github.com/634afddcb3e977ea202d

Vi kan kontrollere, hvordan vi kalder en funktion kaldet ND :: Keyboard :: GetChar. Der får vi tegnet, og hvis det ikke er et tomt tegn (her har jeg brugt 255, skal vi bruge et bedre system) sætter vi tegnet på skærmen og gemmer det i en simpel buffer med tegn (dette er også underlagt forbedring, kan det aktuelle system muligvis løbe over).

nsigneret char ND :: Keyboard :: GetChar () {usigneret char scancode; scancode = (usigneret tegn) ND :: Porte :: InputB (0x60); hvis (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } andet {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }

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

Her kan vi se, hvordan den tast, der er blevet trykket på, opnås. Ved 0x60 vil der altid være den sidste tast, der trykkes ned. Faktisk kan den læses direkte uden brug af IRQ, men så ved vi ikke, hvordan vi skal identificere, hvornår en ændring er sket. Der kontrollerer vi med AND-operationen, at den kode, vi fik, svarer til en nøgle, der er frigivet.

I så fald returnerer vi 255 (for da ignorerer vi det), og ellers er der blevet trykket på tasten. I så fald returnerer vi positionen for en matrix kaldet en_US. Hvilke oplysninger indeholder denne matrix? Denne matrix er, hvad vi vil kalde et nøglekort eller et tegnkort. Som du vil vide, har forskellige sprog forskellige tastaturer, og de understøttes ikke, da de overskriver tasterne. Således giver en_US os den nøgle, der svarer til hver kode, og den fungerer på et amerikansk tastatur.

usigneret 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, / * Venstre skift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Højre skift * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 nøgler * / 0, / * Num lock * / 0, / * Rullelås * / 0, / * Starttast * / 0, / * Pil op * / 0, / * Side op * / '-', 0, / * Venstre pil * / 0, 0, / * Højre pil * / '+', 0, / * Afslut-tast * / 0, / * Pil ned * / 0, / * Side ned * / 0, / * Indsæt-tast * / 0, / * Slet-tast * / 0,0,0, 0, 0, 11, / * F12-F0 taster * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Der var også en defineret funktion, der fik en sætning. Formålet er simpelthen lettere at få adgang til strengene fra de applikationer, der har brug for det, i øjeblikket kun en. Jeg taler om NextShellLite, en reduceret version af den mulige fremtidige shell, som NextDivel ville have. Formålet med NextShellLite er kun at give en reduceret shell til gradvist at teste nye funktionaliteter. Jeg vil ikke lægge shell-koden her, men jeg har inkluderet den i NextDivel-koden.

I øjeblikket fungerer det ikke som et separat program, men som en funktion kaldet af kernen, hovedsageligt fordi vi endnu ikke har tilføjet muligheden for at køre eksekverbare filer. Og selvfølgelig nogle billeder af, hvordan skallen fungerer med de nye tastaturinputfunktioner.

NextShellLite


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   dario sagde han

    fremragende vejleder! tak 🙂

  2.   PopArch sagde han

    Sandheden er, at jeg aldrig fulgte selvstudiet, fordi det i første del gav mig en fejl, da jeg prøvede at kompilere, men jeg kan ikke huske, hvilken fejl det var

  3.   Lopez's kat sagde han

    Undskyld for min store uvidenhed ... hvorfra er disse koder skrevet? Fra terminalen ??

    1.    AdrianArroyoStreet sagde han

      Koderne er en del af kildekoden. Jeg sætter det ikke komplet, for ellers er indlægget alt kode og intet forklaring. Jeg anbefaler, at du læser vejledningerne fra starten, hvis du vil følge den. Du kan også kontrollere den fulde kildekode her (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady sagde han

    Hvordan ville forbedringen være, så overløb ikke forekommer?

    1.    Plock sagde han

      Kady, har du tjekket lagerkoden endnu? Der er den maksimale størrelse etableret såvel som funktioner til at kontrollere den, der kan du foretage ændringen i størrelse eller implementere en rimelig måde at frigøre bufferen på, når den bliver mættet
      Jeg forlader linket for dig at kontrollere det https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico sagde han

    Hej meget interessant, vil du fortsætte med denne "serie" af Emulating Linus Torvals?
    Kan du anbefale en bog, information for at kunne lave en kerne som denne?

    Greetings!

  6.   AnswersVegan.Org sagde han

    Hej. Tak for vejledningen. Kan du anbefale en bog om dette, som du har lavet, og som ikke er "Operativsystemer" af Tanenbaum? På forhånd mange tak.
    Greetings.