Emulera Linus Torvalds: skapa ditt eget operativsystem från grunden (VIII)

Vi återgår till serien handledning om hur vi skapar vårt eget operativsystem. Jag antar att du kommer att gilla det här kapitlet mycket eftersom vi äntligen kan interagera med vårt operativsystem. Idag läser vi tangentbordets ingång. För detta liknar systemet schemat för timern. Vi måste ändå använda IRQ så att vi börjar på samma sätt som med timern.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Vår tangentbordshanterare är dock något mer komplex eftersom vi läser tangenterna och deponerar dem i en buffert.

extern "C" ogiltig 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

Vi kan kontrollera hur vi kallar en funktion som heter ND :: Tangentbord :: GetChar. Där får vi karaktären och sedan om det inte är ett tomt tecken (här har jag använt 255 skulle vi behöva använda ett bättre system) lägger vi karaktären på skärmen och lagrar den i en enkel buffert med tecken (detta är också med förbehåll för förbättringar kan det nuvarande systemet rinna över).

nsignerad char ND :: Keyboard :: GetChar () {osignerad char scancode; scancode = (osignerad karaktär) ND :: Portar :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } annat {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }

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

Här kan vi se hur tangenten som har tryckts erhålls. Vid 0x60 kommer alltid den sista knappen att tryckas. I själva verket kan det läsas direkt utan att behöva använda IRQ, men då vet vi inte hur vi ska identifiera när en förändring har inträffat. Där kontrollerar vi med OCH-operationen att koden vi erhöll motsvarar en nyckel som har släppts.

I så fall returnerar vi 255 (eftersom vi kommer att ignorera det senare) och annars har tangenten tryckts. I så fall returnerar vi positionen för en matris som heter en_US. Vilken information innehåller denna matris? Denna matris är vad vi skulle kalla en tangentkarta eller en karaktärskarta. Som du vet har olika språk olika tangentbord och stöds inte eftersom de skriver över tangenterna. Så en_US ger oss nyckeln som motsvarar varje kod och den fungerar på ett amerikanskt tangentbord.

osignerad 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, / * Left Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Höger skift * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 knappar * / 0, / * Numlås * / 0, / * Bläddringslås * / 0, / * Startknapp * / 0, / * Pil upp * / 0, / * Sidan upp * / '-', 0, / * Vänsterpil * / 0, 0, / * Högerpil * / '+', 0, / * Avsluta-knapp * / 0, / * Nedåtpil * / 0, / * Sidan nedåt * / 0, / * Infoga-tangent * / 0, / * Radera-tangent * / 0,0,0, 0, 0, 11, / * F12-F0-tangenter * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Det fanns också en definierad funktion som fick en fras. Syftet är helt enkelt att lättare komma åt strängarna från de applikationer som behöver det, just nu en. Jag pratar om NextShellLite, en reducerad version av det möjliga framtida skalet som NextDivel skulle ha. Syftet med NextShellLite är enbart att tillhandahålla ett reducerat skal för att gradvis testa nya funktioner. Jag kommer inte att lägga skalkoden här men jag har inkluderat den i NextDivel-koden.

För närvarande fungerar det inte som ett separat program utan som en funktion som kallas av kärnan, främst för att vi ännu inte har lagt till möjligheten att köra körbara filer. Och naturligtvis några bilder på hur skalet fungerar med de nya tangentbordets inmatningsfunktioner.

NextShellLite


Innehållet i artikeln följer våra principer om redaktionell etik. Klicka på för att rapportera ett fel här.

8 kommentarer, lämna din

Lämna din kommentar

Din e-postadress kommer inte att publiceras.

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   daryo sade

    utmärkt handledare! tack 🙂

  2.   PopArch sade

    Sanningen är att jag följde aldrig självstudien eftersom det i första delen gav mig ett fel när jag försökte kompilera men jag kommer inte ihåg vilket fel det var

  3.   Lopez katt sade

    Ledsen för min stora okunnighet ... varifrån är dessa koder skrivna? Från terminalen ??

    1.    AdrianArroyoStreet sade

      Koderna är en del av källkoden. Jag lägger inte det fullständigt för annars är inlägget helt kodat och inget förklaring. Jag rekommenderar att du läser självstudierna från början om du vill följa den. Du kan också kontrollera hela källkoden här (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady sade

    Hur skulle förbättringen vara så att överflöde inte sker?

    1.    Plock sade

      Kady, har du kollat ​​förvarskoden än? Där fastställs den maximala storleken, liksom funktioner för att kontrollera den, där kan du göra storleksändringen eller implementera ett rimligt sätt att frigöra bufferten när den blir mättad
      Jag lämnar länken så att du kan kontrollera den https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico sade

    Hej väldigt intressant, kommer du att fortsätta med denna «serie» av Emulating Linus Torvals?
    Kan du rekommendera någon bok, information för att kunna göra en kärna så här?

    Hälsningar!

  6.   SvarVeganas.Org sade

    Hej. Tack för handledningen. Snälla, kan du rekommendera en bok om detta som du har gjort som inte är "Operativsystem" av Tanenbaum? Tack så mycket på förhand.
    Hälsningar.