Etterligne Linus Torvalds: Lag ditt eget operativsystem fra bunnen av (VIII)

Vi kommer tilbake til serien veiledninger om hvordan du lager vårt eget operativsystem. Jeg antar at du vil like dette kapitlet mye fordi vi endelig kan samhandle med operativsystemet vårt. I dag vil vi lese tastaturinngangen. For dette er ordningen lik timeren. Vi må uansett bruke IRQ, så vi begynner det samme som med timeren.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Tastaturbehandleren vår er imidlertid noe mer kompleks siden vi leser nøklene og legger dem i en buffer.

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

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

Vi kan sjekke hvordan vi kaller en funksjon som heter ND :: Keyboard :: GetChar. Der får vi tegnet, og hvis det ikke er et tomt tegn (her har jeg brukt 255, må vi bruke et bedre system) setter vi tegnet på skjermen og lagrer det i en enkel buffer med tegn (dette er også utsatt for forbedring, kan det nåværende systemet rømme).

nsigned char ND :: Keyboard :: GetChar () {usignert char scancode; scancode = (usignert tegn) ND :: Porter :: InputB (0x60); hvis (scancode & ND_KEYBOARD_KEY_RELEASE) {retur 255; } annet {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 tasten som er trykket er oppnådd. Ved 0x60 vil det alltid være den siste tasten som trykkes. Faktisk kan den leses direkte uten å måtte bruke IRQ, men da vet vi ikke hvordan vi skal identifisere når en endring har skjedd. Der sjekker vi med AND-operasjonen at koden vi har fått tilsvarer en nøkkel som er utgitt.

I så fall returnerer vi 255 (fordi vi vil ignorere det senere) og ellers har du trykket på tasten. I så fall returnerer vi posisjonen til en matrise kalt en_US. Hvilken informasjon inneholder denne matrisen? Denne matrisen er det vi vil kalle et nøkkelkort eller et tegnkart. Som du vet, har forskjellige språk forskjellige tastaturer og støttes ikke da de overskriver tastene. Så en_US vil gi oss nøkkelen som tilsvarer hver kode, og den vil fungere på et amerikansk tastatur.

usignert char no_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øyre skift * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 nøkler * / 0, / * Num lock * / 0, / * Rullelås * / 0, / * Hjem-tast * / 0, / * Pil opp * / 0, / * Side opp * / '-', 0, / * Venstre pil * / 0, 0, / * Høyre pil * / '+', 0, / * Sluttast * / 0, / * Pil ned * / 0, / * Side ned * / 0, / * Sett inn tast * / 0, / * Slett-tast * / 0,0,0, 0, 0, 11, / * F12-F0 nøkler * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Det var også en definert funksjon som fikk en setning. Hensikten er rett og slett å lettere få tilgang til strengene fra applikasjonene som trenger det, for øyeblikket bare en. Jeg snakker om NextShellLite, en redusert versjon av det mulige fremtidige skallet som NextDivel ville ha. Hensikten med NextShellLite er bare å gi et redusert skall for gradvis å teste nye funksjoner. Jeg skal ikke legge skallkoden her, men jeg har tatt den med i NextDivel-koden.

For øyeblikket fungerer det ikke som et eget program, men som en funksjon kalt av kjernen, hovedsakelig fordi vi ennå ikke har lagt til muligheten til å kjøre kjørbare filer. Og selvfølgelig, noen bilder av hvordan skallet fungerer med de nye tastaturinngangsfunksjonene.

NextShellLite


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   dario sa

    utmerket veileder! takk 🙂

  2.   PopArch sa

    Sannheten er at jeg aldri fulgte opplæringen fordi den i første del ga meg en feil når jeg prøvde å kompilere, men jeg husker ikke hvilken feil det var

  3.   Lopez-katten sa

    Beklager min store uvitenhet ... hvor er disse kodene skrevet? Fra terminalen ??

    1.    AdrianArroyoStreet sa

      Kodene er en del av kildekoden. Jeg legger det ikke komplett fordi ellers er innlegget alt kode og ingenting forklaring. Jeg anbefaler at du leser veiledningene fra begynnelsen hvis du vil følge den. Du kan også sjekke hele kildekoden her (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady sa

    Hvordan ville forbedringen være slik at overløp ikke oppstår?

    1.    Plock sa

      Kady, har du sjekket lagringskoden ennå? Der er maksimal størrelse etablert, samt funksjoner for å kontrollere den, der kan du gjøre endringen i størrelse eller implementere en rimelig måte å frigjøre bufferen når den blir mettet
      Jeg legger igjen lenken for deg å sjekke den https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico sa

    Hei veldig interessant, skal du fortsette med denne «serien» av Emulating Linus Torvals?
    Kan du anbefale en bok, informasjon for å kunne lage en kjerne som denne?

    Hilsener !!

  6.   SvarVeganas.Org sa

    Hei. Takk for veiledningen. Kan du anbefale en bok om denne du har laget som ikke er "Operativsystemer" av Tanenbaum? Tusen takk på forhånd.
    Hilsener.