Nabootsing van Linus Torvalds: skep u eie bedryfstelsel van nuuts af (VIII)

Ons keer terug na die reeks tutoriale oor hoe om ons eie bedryfstelsel te skep. Ek veronderstel dat u baie van hierdie hoofstuk sal hou, want ons kan uiteindelik met ons bedryfstelsel in wisselwerking tree. Vandag sal ons die sleutelbordinvoer lees. Hiervoor is die skema soortgelyk aan die van die timer. Ons moet in elk geval IRQ's gebruik, sodat ons dieselfde sal begin as met die timer.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Ons sleutelbordhanteerder is egter ietwat ingewikkelder omdat ons die sleutels lees en in 'n buffer neersit.

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

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

Ons kan kyk hoe ons 'n funksie met die naam ND :: Keyboard :: GetChar noem. Daar kry ons die karakter en as dit dan nie 'n leë karakter is nie (hier het ek 255 gebruik, sal ons 'n beter stelsel moet gebruik) plaas ons die karakter op die skerm en stoor dit in 'n eenvoudige buffer van karakters (dit is ook onderhewig aan verbetering, die huidige stelsel kan oorloop).

nsigned char ND :: Keyboard :: GetChar () {unsigned char scancode; scancode = (ongetekende char) ND :: poorte :: InputB (0x60); as (scancode & ND_KEYBOARD_KEY_RELEASE) {terugkeer 255; } anders {return en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; retour stringBuffer; }

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

Hier kan ons sien hoe die ingedrukte sleutel verkry word. By 0x60 sal daar altyd die laaste toets gedruk word. In werklikheid kan dit direk gelees word sonder om die IRQ te gebruik, maar dan sal ons nie weet hoe om te identifiseer wanneer 'n verandering plaasgevind het nie. Daar gaan ons na met die EN-bewerking dat die kode wat ons verkry het, ooreenstem met 'n sleutel wat vrygestel is.

In daardie geval stuur ons 255 terug (omdat ons dit later sal ignoreer) en anders is die sleutel gedruk. In daardie geval gee ons die posisie terug van 'n skikking genaamd en_US. Watter inligting bevat hierdie skikking? Hierdie skikking is wat ons 'n sleutelkaart of 'n karakterkaart sal noem. Soos u sal weet, het verskillende tale verskillende sleutelborde en word dit nie ondersteun nie omdat dit die sleutels oorskryf. Dus sal en_US ons die sleutel gee wat ooreenstem met elke kode en dit sal op 'n Amerikaanse sleutelbord werk.

ongetekende 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, / * Regs skuif * /' * ', 0, / * Alt * / '', 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 sleutels * / 0, / * Num lock * / 0, / * Scroll lock * / 0, / * Home key * / 0, / * Up arrow * / 0, / * Page up * / '-', 0, / * Left arrow * / 0, 0, / * Right arrow * / '+', 0, / * Eindtoets * / 0, / * Pijltjie-onder * / 0, / * Bladsy af * / 0, / * Voeg sleutel in * / 0, / * Skrap sleutel * / 0,0,0, 0, 0, 11, / * F12-F0 sleutels * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Daar was ook 'n gedefinieerde funksie wat 'n frase gekry het. Die doel is om makliker toegang te verkry tot die snare uit die toepassings wat dit benodig, op die oomblik slegs een. Ek praat van NextShellLite, 'n verkleinde weergawe van die moontlike toekomstige dop wat NextDivel sou hê. Die doel van NextShellLite is slegs om 'n verminderde dop te bied om geleidelik nuwe funksies te toets. Ek gaan nie die dopkode hier plaas nie, maar ek het dit in die NextDivel-kode opgeneem.

Op die oomblik werk dit nie as 'n aparte program nie, maar as 'n funksie wat deur die kern genoem word, hoofsaaklik omdat ons nog nie die opsie gevoeg het om uitvoerbare programme uit te voer nie. En natuurlik 'n paar foto's van hoe die dop werk met die nuwe sleutelbordinvoerfunksies.

NextShellLite


Die inhoud van die artikel voldoen aan ons beginsels van redaksionele etiek. Klik op om 'n fout te rapporteer hier.

8 kommentaar, los joune

Laat u kommentaar

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde gemerk met *

*

*

  1. Verantwoordelik vir die data: Miguel Ángel Gatón
  2. Doel van die data: Beheer SPAM, bestuur van kommentaar.
  3. Wettiging: U toestemming
  4. Kommunikasie van die data: Die data sal nie aan derde partye oorgedra word nie, behalwe deur wettige verpligtinge.
  5. Datastoor: databasis aangebied deur Occentus Networks (EU)
  6. Regte: U kan u inligting te alle tye beperk, herstel en verwyder.

  1.   dario dijo

    uitstekende tutor! dankie 🙂

  2.   PopArch dijo

    Die waarheid is dat ek nooit die tutoriaal gevolg het nie, want dit het my in die eerste deel 'n fout gegee toe ek probeer saamstel, maar ek weet nie watter fout dit was nie

  3.   Die Lopez se kat dijo

    Jammer vir my groot onkunde ... van waar is hierdie kodes geskryf? Van die terminale af ??

    1.    AdrianArroyoStreet dijo

      Die kodes is deel van die bronkode. Ek stel dit nie volledig nie, want anders is die boodskap alles kode en niks verduidelik nie. Ek beveel aan dat u die tutoriale van die begin af lees as u dit wil volg. U kan ook die volledige bronkode hier nagaan (http://github.com/AdrianArroyoCalle/next-divel)

  4.   kady dijo

    Hoe sou die verbetering wees sodat oorloop nie plaasvind nie?

    1.    Plock dijo

      Kady, het jy al die bewaarplek-kode nagegaan? Daar is die maksimum grootte vasgestel, asook funksies om dit te beheer, daar kan u die grootte verander of 'n redelike manier implementeer om die buffer vry te maak as dit versadig raak
      Ek los die skakel vir u om dit na te gaan https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Nico dijo

    Hallo baie interessant, gaan u voortgaan met hierdie «reeks» van Emulating Linus Torvals?
    Kan u een of ander boek aanbeveel om 'n kern soos hierdie te kan maak?

    Groete!

  6.   AntwoordeVeganas.Org dijo

    Hi. Dankie vir die tutoriaal. Kan u asseblief 'n boek hieroor aanbeveel wat u gemaak het wat nie 'Operating Systems' van Tanenbaum is nie? Baie dankie by voorbaat.
    Groete.