Linus Torvalds utánzása: saját operációs rendszer létrehozása a semmiből (VIII)

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.

NextShellLite


Hagyja megjegyzését

E-mail címed nem kerül nyilvánosságra. Kötelező mezők vannak jelölve *

*

*

  1. Az adatokért felelős: Miguel Ángel Gatón
  2. Az adatok célja: A SPAM ellenőrzése, a megjegyzések kezelése.
  3. Legitimáció: Az Ön beleegyezése
  4. Az adatok közlése: Az adatokat csak jogi kötelezettség alapján továbbítjuk harmadik felekkel.
  5. Adattárolás: Az Occentus Networks (EU) által üzemeltetett adatbázis
  6. Jogok: Bármikor korlátozhatja, helyreállíthatja és törölheti adatait.

  1.   dario dijo

    kiváló oktató! köszönöm 🙂

  2.   PopArch dijo

    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

  3.   Lopez macskája dijo

    Elnézést a durva tudatlanságomért ... honnan írják ezeket a kódokat? A terminálról ??

    1.    AdrianArroyoStreet dijo

      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)

  4.   Kady dijo

    Milyen lenne a javulás, hogy ne történjen túlcsordulás?

    1.    Plock dijo

      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

  5.   Nico dijo

    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!

  6.   Válaszok Vegán.Org dijo

    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.