Visszatérünk a saját operációs rendszerünk létrehozásával kapcsolatos oktatósorozathoz. Feltételezem, hogy nagyon tetszeni fog ez a fejezet, mert végre kölcsönhatásba léphetünk az operációs rendszerünkkel. Ma elolvassuk a billentyűzet bevitelét. Ehhez a séma hasonló az időzítőéhez. Mindenesetre IRQ-kat kell használnunk, így ugyanúgy kezdjük, mint az időzítővel.
ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);
A billentyűzetkezelőnk azonban valamivel bonyolultabb, mivel olvasjuk a kulcsokat és pufferbe helyezzük őket.
extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Billentyűzet :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}
http://gist.github.com/634afddcb3e977ea202d
Ellenőrizhetjük, hogy hívjuk az ND :: Keyboard :: GetChar nevű függvényt. Ott megkapjuk a karaktert, majd ha nem egy üres karakter (itt 255-et használtam, jobb rendszert kellene használnunk), akkor a karaktert a képernyőre tesszük, és egyszerű karakterjelek között tároljuk (ez szintén javítható, a jelenlegi rendszer túlcsordulhat).
nsigned char ND :: Billentyűzet :: GetChar () {unsigned char scancode; scancode = (előjel nélküli karakter) ND :: Portok :: BemenetB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Billentyűzet :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; return stringBuffer; }
http://gist.github.com/2d4f13e0b1a281c66884
Itt láthatjuk, hogyan kapjuk meg a megnyomott billentyűt. 0x60-nál mindig az utolsó gomb lenyomása lesz. Valójában közvetlenül olvasható az IRQ használata nélkül, de akkor nem fogjuk tudni, hogyan lehet azonosítani, ha változás történt. Ott az AND művelettel ellenőrizzük, hogy a megszerzett kód megfelel-e egy kiadott kulcsnak.
Ebben az esetben 255-öt adunk vissza (mert később figyelmen kívül hagyjuk), különben a gombot megnyomtuk. Ebben az esetben egy en_US nevű tömb helyzetét adjuk vissza. Milyen információkat tartalmaz ez a tömb? Ezt a tömböt nevezzük billentyűtérképnek vagy karaktertérképnek. Mint tudják, a különböző nyelvek különböző billentyűzettel rendelkeznek, és nem támogatottak, mivel felülírják a billentyűket. Tehát az en_US megadja az egyes kódoknak megfelelő kulcsot, és amerikai billentyűzeten fog működni.
aláíratlan karakter 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, / * bal váltás * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Jobbra tolás * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 billentyűk * / 0, / * Num lock * / 0, / * Görgetés zárolása * / 0, / * Főgomb * / 0, / * Felfelé nyíl * / 0, / * Oldal felfelé * / '-', 0, / * Balra nyíl * / 0, 0, / * Jobbra nyíl * / '+', 0, / * Vége gomb * / 0, / * Lefelé mutató nyíl * / 0, / * Oldal lefelé * / 0, / * Billentyű beszúrása * / 0, / * Törlés gomb * / 0,0,0, 0, 0, 11, / * F12-F0 billentyűk * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Volt egy meghatározott funkció is, amely kapott egy kifejezést. A cél egyszerűen az, hogy könnyebben hozzáférjen a húrokhoz azoktól az alkalmazásoktól, amelyekre szüksége van, jelenleg csak egy. A NextShellLite-ről beszélek, a jövőbeli lehetséges héj kicsinyített változatáról, amely a NextDivel rendelkezésére áll. A NextShellLite célja csak egy csökkentett héj biztosítása az új funkciók fokozatos teszteléséhez. Nem fogom ide tenni a shell kódot, de felvettem a NextDivel kódba.
Jelenleg nem külön programként, hanem a kernel által meghívott funkcióként működik, elsősorban azért, mert még nem adtuk hozzá a futtatható fájlok futtatásának lehetőségét. És természetesen néhány kép arról, hogy a shell hogyan működik az új billentyűzet beviteli funkciókkal.
kiváló oktató! köszönöm 🙂
Az az igazság, hogy soha nem követtem az oktatóanyagot, mert az első részben hibát okozott a fordítás során, de nem emlékszem, hogy mi volt a hiba
Elnézést a durva tudatlanságomért ... honnan írják ezeket a kódokat? A terminálról ??
A kódok a forráskód részét képezik. Nem teszem teljessé, mert különben a bejegyzés minden kód és semmi magyarázat. Javaslom, hogy olvassa el az oktatóanyagokat a kezdetektől, ha követni szeretné. A teljes forráskódot itt is ellenőrizheti (http://github.com/AdrianArroyoCalle/next-divel)
Milyen lenne a javulás, hogy ne történjen túlcsordulás?
Kady, ellenőrizted már a tárház kódját? Ott van megállapítva a maximális méret, valamint a vezérléséhez szükséges funkciók, ott megváltoztathatja a méretet, vagy ésszerű módon szabadíthatja fel a puffert, ha telítetté válik
Hagyom neked a linket, hogy ellenőrizhesd https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Helló, nagyon érdekes! Folytatja a Linus Torvals emulálásának ezt a "sorozatát"?
Tudna ajánlani egy könyvet, információt ahhoz, hogy ilyen kernelt készítsen?
Üdvözlet!
Szia. Köszönöm a bemutatót. Kérem, tudna ajánlani egy könyvet erről, amelyet készített, amely nem Tanenbaum "operációs rendszere"? Előre is köszönöm szépen.
Üdvözlet.