Linus Torvalds emuleren: maak uw eigen besturingssysteem vanaf nul (VIII)

We keren terug naar de reeks tutorials over hoe we ons eigen besturingssysteem kunnen maken. Ik neem aan dat je dit hoofdstuk erg leuk zult vinden, omdat we eindelijk kunnen communiceren met ons besturingssysteem. Vandaag zullen we de toetsenbordinvoer lezen. Hiervoor is het schema vergelijkbaar met dat van de timer. We moeten hoe dan ook IRQ's gebruiken, dus we beginnen hetzelfde als met de timer.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Onze toetsenbordhandler is echter wat complexer omdat we de toetsen lezen en ze in een buffer plaatsen.

extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

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

We kunnen controleren hoe we een functie genaamd ND :: Keyboard :: GetChar noemen. Daar krijgen we het karakter en als het geen leeg karakter is (hier heb ik 255 gebruikt, zouden we een beter systeem moeten gebruiken), plaatsen we het karakter op het scherm en slaan het op in een simpele buffer van karakters (dit is ook vatbaar voor verbetering, het huidige systeem kan overlopen).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (unsigned char) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {retourneer 255; } else {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }

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

Hier kunnen we zien hoe de ingedrukte toets wordt verkregen. Bij 0x60 zal altijd de laatste toets zijn ingedrukt. In feite kan het direct worden gelezen zonder de IRQ te hoeven gebruiken, maar dan weten we niet hoe we kunnen vaststellen wanneer er een wijziging heeft plaatsgevonden. Daar controleren we met de AND-bewerking of de code die we hebben verkregen overeenkomt met een sleutel die is vrijgegeven.

In dat geval geven we 255 terug (omdat we het later negeren) en anders is de toets ingedrukt. In dat geval retourneren we de positie van een array genaamd en_US. Welke informatie bevat deze array? Deze array is wat we een keymap of een character map zouden noemen. Zoals u weet, hebben verschillende talen verschillende toetsenborden en worden ze niet ondersteund omdat ze de toetsen overschrijven. Dus en_US geeft ons de sleutel die overeenkomt met elke code en het werkt op een Amerikaans toetsenbord.

unsigned 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, / * Linker Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Rechts verschuiven * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10-toetsen * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Starttoets * / 0, / * Pijl omhoog * / 0, / * Pagina omhoog * / '-', 0, / * Pijl naar links * / 0, 0, / * Pijl naar rechts * / '+', 0, / * Eindetoets * / 0, / * Pijl omlaag * / 0, / * Pagina omlaag * / 0, / * Toets invoegen * / 0, / * Verwijdertoets * / 0,0,0, 0, 0, 11, / * F12-F0 toetsen * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Er was ook een gedefinieerde functie die een zin kreeg. Het doel is simpelweg om gemakkelijker toegang te krijgen tot de strings van de applicaties die het nodig hebben, op dit moment slechts één. Ik heb het over NextShellLite, een gereduceerde versie van de mogelijke toekomstige shell die NextDivel zou hebben. Het doel van NextShellLite is alleen om een ​​verkleinde shell te bieden om geleidelijk nieuwe functionaliteiten te testen. Ik ga de shell-code hier niet plaatsen, maar ik heb deze opgenomen in de NextDivel-code.

Op dit moment werkt het niet als een apart programma maar als een functie die door de kernel wordt aangeroepen, voornamelijk omdat we de optie om executables te draaien nog niet hebben toegevoegd. En natuurlijk enkele foto's van hoe de shell werkt met de nieuwe toetsenbordinvoerfuncties.

VolgendeShellLite


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   dario zei

    uitstekende tutor! bedankt 🙂

  2.   PopArch zei

    De waarheid is dat ik de tutorial nooit heb gevolgd, omdat ik in het eerste deel een fout kreeg bij het compileren, maar ik weet niet meer welke fout het was

  3.   De kat van Lopez zei

    Sorry voor mijn grove onwetendheid ... waar zijn deze codes geschreven? Vanaf de terminal ??

    1.    AdrianArroyoStreet zei

      De codes maken deel uit van de broncode. Ik zet het niet compleet want anders is de post allemaal code en niets uitleg. Ik raad je aan om de tutorials vanaf het begin te lezen als je deze wilt volgen. Je kunt hier ook de volledige broncode bekijken (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady zei

    Hoe zou de verbetering zijn zodat er geen overstroming optreedt?

    1.    Plock zei

      Kady, heb je de repositorycode al gecontroleerd? Daar wordt de maximale grootte vastgesteld, evenals functies om deze te besturen, daar kunt u de verandering in grootte aanbrengen of een redelijke manier implementeren om de buffer vrij te maken wanneer deze verzadigd raakt
      Ik laat de link achter zodat u deze kunt controleren https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico zei

    Hallo heel interessant, ga je door met deze «serie» Emuleren Linus Torvals?
    Kun je wat boek, informatie aanbevelen om een ​​kernel als deze te kunnen maken?

    Groeten!

  6.   Antwoorden Veganas.Org zei

    Hoi. Bedankt voor de tutorial. Kunt u alstublieft een boek hierover aanbevelen dat u heeft gemaakt dat niet "Operating Systems" van Tanenbaum is? Alvast heel erg bedankt.
    Groeten.