Kopiante Linus Torvalds: kreu vian propran operaciumon de nulo (VIII)

Ni revenas al la serio de lerniloj pri kiel krei nian propran operaciumon. Mi supozas, ke ĉi tiu ĉapitro multe plaĉos al vi, ĉar ni finfine povas interagi kun nia operaciumo. Hodiaŭ ni legos la klavaran enigon. Por ĉi tio, la skemo similas al tiu de la tempigilo. Ni devas uzi IRQs ĉiuokaze do ni komencos same kiel kun la tempigilo.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Nia klavara pritraktanto tamen estas iom pli kompleksa, ĉar ni legas la klavojn kaj deponas ilin en bufro.

extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = kodo de kodo; ĉenoPos ++; }}

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

Ni povas kontroli kiel ni nomas funkcion nomatan ND :: Keyboard :: GetChar. Tie ni akiras la signon kaj tiam se ĝi ne estas malplena signo (ĉi tie mi uzis 255, ni devus uzi pli bonan sistemon) ni metas la signon sur la ekranon kaj konservas ĝin en simpla bufro de signoj (ĉi tio ankaŭ estas plibonigebla, la nuna sistemo povus superflui).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (sennoma signo) ND :: Havenoj :: EnigoB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {return en_US [scancode]; }} char * ND :: Klavaro :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; redonu stringBuffer; }

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

Ĉi tie ni povas vidi kiel la klavo premita estas akirita. Je 0x60 ĉiam aperos la lasta klavo. Fakte, ĝi legeblas rekte sen devi uzi la IRQ, sed tiam ni ne scios kiel identigi kiam ŝanĝo okazis. Tie ni kontrolas per la operacio KAJ, ke la kodo, kiun ni akiris, respondas al ŝlosilo, kiun oni ĉesis premi.

En tiu kazo ni redonas 255 (ĉar tiam ni ignoros ĝin) kaj alie la klavo estis premita. En tiu kazo ni redonas la pozicion de tabelo nomata en_US. Kiajn informojn enhavas ĉi tiu tabelo? Ĉi tiu tabelo estas tio, kion ni nomus ŝlosila mapo aŭ signokarto. Kiel vi scias, malsamaj lingvoj havas malsamajn klavarojn kaj ne estas subtenataj ĉar ili anstataŭigas la klavojn. Do en_US donos al ni la klavon respondan al ĉiu kodo kaj ĝi funkcios per usona klavaro.

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, / * Maldekstra Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Dekstra majusklo * / '*', 0, / * Alt * / '', 0, / * Majuskla ŝlosilo * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10-klavoj * / 0, / * Num-ŝlosilo * / 0, / * Scroll lock * / 0, / * Hejma ŝlosilo * / 0, / * Suva sago * / 0, / * Paĝo supren * / '-', 0, / * Maldekstra sago * / 0, 0, / * Dekstra sago * / '+', 0, / * Fina klavo * / 0, / * Suba sago * / 0, / * Paĝo malsupren * / 0, / * Eniga klavo * / 0, / * Forigi klavon * / 0,0,0, 0, 0, 11, / * F12-F0-Ŝlosiloj * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Estis ankaŭ difinita funkcio, kiu ricevis frazon. La celo estas simple pli facile aliri la ĉenojn de la programoj, kiuj bezonas ĝin, nuntempe nur unu. Mi parolas pri NextShellLite, reduktita versio de la ebla estonta ŝelo, kiun NextDivel havus. La celo de NextShellLite estas nur provizi reduktitan ŝelon por iom post iom testi novajn funkciojn. Mi ne metos la ŝelan kodon ĉi tie, sed mi inkluzivis ĝin en la sekvan kodon NextDivel.

Nuntempe ĝi ne funkcias kiel aparta programo sed kiel funkcio nomata de la kerno, ĉefe ĉar ni ankoraŭ ne aldonis la eblon ruli plenumeblajn. Kaj kompreneble, iuj bildoj pri kiel la ŝelo funkcias kun la novaj klavaraj enigaj funkcioj.

SekvaShellLite


La enhavo de la artikolo aliĝas al niaj principoj de redakcia etiko. Por raporti eraron alklaku Ĉi tie.

8 komentoj, lasu la viajn

Lasu vian komenton

Via retpoŝta adreso ne estos eldonita. Postulita kampojn estas markita per *

*

*

  1. Respondeculo pri la datumoj: Miguel Ángel Gatón
  2. Celo de la datumoj: Kontrola SPAM, administrado de komentoj.
  3. Legitimado: Via konsento
  4. Komunikado de la datumoj: La datumoj ne estos komunikitaj al triaj krom per laŭleĝa devo.
  5. Stokado de datumoj: Datumbazo gastigita de Occentus Networks (EU)
  6. Rajtoj: Iam ajn vi povas limigi, retrovi kaj forigi viajn informojn.

  1.   dario diris

    bonega instruisto! dankon 🙂

  2.   Poparko diris

    La vero estas, ke mi neniam sekvis la lernilon, ĉar en la unua parto ĝi donis al mi eraron kiam mi provis kompili, sed mi ne memoras, kia eraro ĝi estis

  3.   La kato de Lopez diris

    Pardonu mian krudan nescion ... de kie estas skribitaj ĉi tiuj kodoj? De la fina stacio ??

    1.    AdrianArroyoStreet diris

      La kodoj estas parto de la fontkodo. Mi ne metas ĝin komplete, ĉar alie la afiŝo estas tute kodo kaj nenio klarigas. Mi rekomendas al vi legi la lernilojn de la komenco se vi volas sekvi ĝin. Vi ankaŭ povas kontroli la plenan fontkodon ĉi tie (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady diris

    Kiel la plibonigo estus tiel ke superfluo ne okazu?

    1.    plock diris

      Kady, ĉu vi jam kontrolis la deponejan kodon? Tie la maksimuma grandeco estas establita, same kiel funkcioj por regi ĝin, tie vi povas fari la ŝanĝon de grandeco aŭ efektivigi racian manieron liberigi la bufron kiam ĝi saturas
      Mi lasas la ligon por ke vi kontrolu ĝin https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico diris

    Saluton tre interesa, ĉu vi daŭrigos per ĉi tiu «serio» de Emulado de Linus Torvals?
    Ĉu vi povas rekomendi iun libron, informojn por povi krei kernon tiel?

    Salutoj !!

  6.   Respondoj Veganas.Org diris

    Saluton. Dankon pro la lernilo. Bonvolu, ĉu vi povas rekomendi libron pri tio, kiun vi faris, kiu ne estas "Operaciumoj" de Tanenbaum? Dankegon anticipe.
    Salutojn.