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.
utmerket veileder! takk 🙂
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
Beklager min store uvitenhet ... hvor er disse kodene skrevet? Fra terminalen ??
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)
Hvordan ville forbedringen være slik at overløp ikke oppstår?
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
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 !!
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.