Emulace Linuse Torvaldse: vytvořte si svůj vlastní operační systém od nuly (VIII)

Vrátíme se k sérii návodů, jak vytvořit vlastní operační systém. Předpokládám, že se vám tato kapitola bude hodně líbit, protože můžeme konečně komunikovat s naším operačním systémem. Dnes si přečteme vstup z klávesnice. Z tohoto důvodu je schéma podobné schématu časovače. Musíme stejně použít IRQ, takže začneme stejně jako u časovače.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Náš obslužný program klávesnice je však poněkud složitější, protože čteme klíče a ukládáme je do vyrovnávací paměti.

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

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

Můžeme zkontrolovat, jak nazýváme funkci nazvanou ND :: Keyboard :: GetChar. Tam získáme znak a pak, pokud to není prázdný znak (zde jsem použil 255, měli bychom použít lepší systém), dáme znak na obrazovku a uložíme jej do jednoduché vyrovnávací paměti znaků (to také podléhá zlepšení, může současný systém přetéct).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (nepodepsaný znak) ND :: Porty :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {návrat 255; } else {return en_US [skenovací kód]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; návrat stringBuffer; }

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

Zde vidíme, jak se získá stisknutá klávesa. Na 0x60 bude vždy poslední stisknutá klávesa. Ve skutečnosti jej lze číst přímo, aniž byste museli používat IRQ, ale pak nebudeme vědět, jak identifikovat, kdy došlo ke změně. Tam pomocí operace AND zkontrolujeme, zda kód, který jsme získali, odpovídá klíči, který byl uvolněn.

V takovém případě vrátíme 255 (protože to budeme později ignorovat) a jinak byla klávesa stisknuta. V takovém případě vrátíme pozici pole s názvem en_US. Jaké informace obsahuje toto pole? Toto pole je to, co bychom nazvali mapa kláves nebo mapa znaků. Jak víte, různé jazyky mají různé klávesnice a nejsou podporovány, protože přepisují klíče. En_US nám tedy dá klíč odpovídající každému kódu a bude fungovat na americké klávesnici.

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, / * Levý posun * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Posun doprava * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * klávesy F1-F10 * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Tlačítko Domů * / 0, / * Šipka nahoru * / 0, / * Stránka nahoru * / '-', 0, / * Šipka vlevo * / 0, 0, / * Šipka vpravo * / '+', 0, / * klávesa End * / 0, / * šipka dolů * / 0, / * stránka dolů * / 0, / * klávesa Insert * / 0, / * klávesa Delete * / 0,0,0, 0, 0, 11, / * klávesy F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Existovala také definovaná funkce, která dostala frázi. Účelem je jednoduše snadnější přístup k řetězcům z aplikací, které to potřebují, v tuto chvíli pouze jeden. Mluvím o NextShellLite, redukované verzi možného budoucího shellu, který by měl NextDivel. Účelem NextShellLite je pouze poskytnout zmenšený shell pro postupné testování nových funkcí. Nebudu sem dávat kód shellu, ale zahrnul jsem ho do kódu NextDivel.

V tuto chvíli to nefunguje jako samostatný program, ale jako funkce volaná jádrem, hlavně proto, že jsme ještě nepřidali možnost spustit spustitelné soubory. A samozřejmě několik obrázků toho, jak shell pracuje s novými vstupními funkcemi klávesnice.

DalšíShellLite


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Odpovědný za údaje: Miguel Ángel Gatón
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   Daryo řekl

    vynikající lektor! díky 🙂

  2.   PopArch řekl

    Pravdou je, že jsem tutoriál nikdy nesledoval, protože v první části mi při pokusu o kompilaci došlo k chybě, ale nepamatuji si, o jakou chybu se jednalo

  3.   Lopezova kočka řekl

    Omlouvám se za moji hloupou nevědomost ... odkud jsou tyto kódy zapsány? Z terminálu ??

    1.    AdrianArroyo Street řekl

      Kódy jsou součástí zdrojového kódu. Nedávám to úplně, protože jinak je příspěvek celý kód a žádné vysvětlení. Doporučuji vám přečíst si návody od začátku, pokud se jimi chcete řídit. Celý zdrojový kód můžete také zkontrolovat zde (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady řekl

    Jak by došlo ke zlepšení, aby nedošlo k přetečení?

    1.    Plock řekl

      Kady, zkontroloval jsi již kód úložiště? Tam je stanovena maximální velikost, stejně jako funkce pro její ovládání, tam můžete provést změnu velikosti nebo implementovat rozumný způsob, jak uvolnit vyrovnávací paměť, když se nasytí
      Nechám vám odkaz, abyste to zkontrolovali https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico řekl

    Dobrý den, velmi zajímavé, budete pokračovat v této «sérii» emulace Linus Torvals?
    Můžete mi doporučit nějakou knihu, informace, abyste mohli vytvořit takové jádro?

    Zdravím !!

  6.   OdpovědiVeganas.Org řekl

    Ahoj. Děkujeme za návod. Můžete mi doporučit knihu, kterou jste vytvořili a která není „operačním systémem“ od Tanenbauma? Předem moc děkuji.
    Zdravím.