Paggaya sa Linus Torvalds: lumikha ng iyong sariling operating system mula sa simula (VIII)

Bumalik kami sa serye ng mga tutorial sa kung paano lumikha ng aming sariling operating system. Ipagpalagay ko na magugustuhan mo ang kabanatang ito nang marami dahil sa wakas maaari kaming makipag-ugnay sa aming operating system. Ngayon ay babasahin natin ang input ng keyboard. Para sa mga ito, ang pamamaraan ay pareho sa timer. Kailangang gumamit pa rin kami ng mga IRQ kaya magsisimula kaming pareho sa timer.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Ang aming keyboard handler, gayunpaman, ay medyo mas kumplikado habang binabasa namin ang mga susi at inilalagay ang mga ito sa isang buffer.

extern "C" walang bisa ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); kung (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = scancode; stringPos ++; }}

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

Maaari naming suriin kung paano tayo tumawag sa isang pagpapaandar na tinatawag na ND :: Keyboard :: GetChar. Doon nakuha namin ang character at kung hindi ito isang walang laman na character (narito na ginamit ko ang 255, kailangan naming gumamit ng isang mas mahusay na system) inilalagay namin ang character sa screen at iniimbak ito sa isang simpleng buffer ng chars (ito rin napapailalim sa pagpapabuti, ang kasalukuyang system ay maaaring umapaw).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (unsigned char) ND :: Port :: InputB (0x60); kung (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } iba pa {bumalik en_US [scancode]; }} char * ND :: Keyboard :: GetString () {habang (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; ibalik ang stringBuffer; }

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

Makikita natin dito kung paano nakuha ang susi na pinindot. Sa 0x60 palaging magiging ang huling pindutan ay pinindot. Sa katunayan maaari itong basahin nang direkta nang hindi kinakailangang gamitin ang IRQ, ngunit pagkatapos ay hindi namin malalaman kung paano makilala kung may naganap na pagbabago. Doon namin suriin sa pagpapatakbo ng AT na ang code na aming nakuha ay tumutugma sa isang susi na tumigil sa pagpindot.

Sa kasong iyon ay ibabalik namin ang 255 (sapagkat hindi namin ito papansinin sa paglaon) at kung hindi man ay pinindot ang susi. Sa kasong iyon ibabalik namin ang posisyon ng isang array na tinatawag na en_US. Anong impormasyon ang nilalaman ng array na ito? Ang array na ito ay ang tatawagin namin na isang keymap o isang map ng character. Tulad ng alam mo, ang iba't ibang mga wika ay may iba't ibang mga keyboard at hindi sinusuportahan habang sinusuportahan nila ang mga key. Sa gayon ay bibigyan kami ng en_US ng susi na naaayon sa bawat code at gagana ito sa isang American keyboard.

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, / * Left Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Tamang paglilipat * / '*', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 key * / 0, / * Num lock * / 0, / * Mag-scroll lock * / 0, / * Home key * / 0, / * Up arrow * / 0, / * Page up * / '-', 0, / * Left arrow * / 0, 0, / * Right arrow * / '+', 0, / * End key * / 0, / * Pababang arrow * / 0, / * Pahina pababa * / 0, / * Ipasok ang key * / 0, / * Tanggalin ang key * / 0,0,0, 0, 0, 11, / * F12-F0 Keys * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Mayroon ding isang tinukoy na pagpapaandar na nakakuha ng isang parirala. Ang layunin ay upang mas madaling ma-access ang mga string mula sa mga application na nangangailangan nito, sa ngayon isa lamang. Pinag-uusapan ko ang tungkol sa NextShellLite, isang nabawasan na bersyon ng posibleng hinaharap na shell na magkakaroon ang NextDivel. Ang layunin ng NextShellLite ay nag-iisa lamang upang magbigay ng isang nabawasan na shell upang dahan-dahang subukan ang mga bagong pag-andar. Hindi ko ilalagay ang code ng shell dito ngunit isinama ko ito sa loob ng NextDivel code.

Sa ngayon hindi ito gumagana bilang isang hiwalay na programa ngunit bilang isang pagpapaandar na tinawag ng kernel, higit sa lahat dahil hindi pa namin naidagdag ang pagpipilian upang patakbuhin ang mga maipapatupad. At syempre, ang ilang mga larawan kung paano gumagana ang shell sa mga bagong pag-andar ng pag-input ng keyboard.

SusunodShellLite


8 na puna, iwan mo na ang iyo

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   dario dijo

    mahusay na tagapagturo! salamat 🙂

  2.   PopArch dijo

    Ang totoo, hindi ko sinundan ang tutorial dahil sa unang bahagi ay binigyan ako nito ng isang error kapag sinusubukang i-compile ngunit hindi ko naalala kung anong error ito

  3.   Ang pusa ni Lopez dijo

    Paumanhin sa aking kamangmangan sa crass ... saan nagmula ang mga code na ito? Galing sa terminal ??

    1.    AdrianArroyoStreet dijo

      Ang mga code ay bahagi ng source code. Hindi ko inilalagay ito kumpleto dahil kung hindi ang post ay lahat ng code at walang paliwanag. Inirerekumenda ko na basahin mo ang mga tutorial mula sa simula kung nais mong sundin ito. Maaari mo ring suriin ang buong source code dito (http://github.com/AdrianArroyoCalle/next-divel)

  4.   kady dijo

    Paano magiging ang pagpapabuti upang ang pag-apaw ay hindi nangyari?

    1.    Plock dijo

      Kady, nasuri mo na ba ang code ng repository? Nariyan ang maximum na laki ay naitatag, pati na rin ang mga pagpapaandar upang makontrol ito, doon maaari mong gawin ang pagbabago sa laki o magpatupad ng isang makatwirang paraan upang mapalaya ang buffer kapag ito ay nabusog.
      Iniwan ko ang link para suriin mo ito https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico dijo

    Kamusta na napaka nakakainteres, magpapatuloy ka ba sa "serye" na ito ng Emulate Linus Torvals?
    Maaari ba kayong magrekomenda ng anumang libro, impormasyon upang makapagawang isang kernel na tulad nito?

    Pagbati!

  6.   Mga SagotVeganas.Org dijo

    Hi Salamat sa tutorial. Mangyaring, maaari ba kayong magrekomenda ng isang libro tungkol sa iyong nagawa na hindi "Mga Operating System" ni Tanenbaum? Maraming salamat po muna
    Pagbati.