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.
vynikající lektor! díky 🙂
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
Omlouvám se za moji hloupou nevědomost ... odkud jsou tyto kódy zapsány? Z terminálu ??
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)
Jak by došlo ke zlepšení, aby nedošlo k přetečení?
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
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 !!
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.