Емулиране на Linus Torvalds: създайте своя собствена операционна система от нулата (VIII)

Връщаме се към поредицата уроци за това как да създадем наша собствена операционна система. Предполагам, че тази глава ще ви хареса много, защото най-накрая можем да взаимодействаме с нашата операционна система. Днес ще прочетем въвеждането от клавиатурата. За това схемата е подобна на тази на таймера. Все пак трябва да използваме IRQ, така че ще стартираме по същия начин, както при таймера.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Нашият манипулатор на клавиатура обаче е малко по-сложен, тъй като четем клавишите и ги депозираме в буфер.

extern "C" void ND_Keyboard_Handler (struct regs * r) {unsigned char scancode = ND :: Keyboard :: GetChar (); if (scancode! = 255) {ND :: Screen :: PutChar (scancode); stringBuffer [stringPos] = код за сканиране; stringPos ++; }}

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

Можем да проверим как извикваме функция, наречена ND :: Keyboard :: GetChar. Там получаваме символа и след това, ако той не е празен знак (тук съм използвал 255, ще трябва да използваме по-добра система), поставяме символа на екрана и го съхраняваме в обикновен буфер от символи (това също е податливо на подобрение, текущата система може да прелее).

nsigned char ND :: Клавиатура :: GetChar () {неподписан код за сканиране на char; scancode = (неподписан знак) ND :: Ports :: InputB (0x60); if (scancode & ND_KEYBOARD_KEY_RELEASE) {return 255; } else {връщане en_US [scancode]; }} char * ND :: Keyboard :: GetString () {while (stringBuffer [stringPos-1]! = '\ n') {} stringPos = 0; връщане stringBuffer; }

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

Тук можем да видим как се получава клавишът, който е бил натиснат. При 0x60 винаги ще има последния натиснат бутон. Всъщност може да се чете директно, без да се налага да се използва IRQ, но тогава няма да знаем как да идентифицираме кога е настъпила промяна. Там проверяваме с операцията И, че полученият от нас код съответства на ключ, който е бил освободен.

В този случай връщаме 255 (защото ще го игнорираме по-късно) и в противен случай клавишът е бил натиснат. В този случай връщаме позицията на масив, наречен en_US. Каква информация съдържа този масив? Този масив е това, което бихме нарекли карта на клавишите или карта на символите. Както знаете, различните езици имат различни клавиатури и не се поддържат, тъй като те презаписват клавишите. Така че en_US ще ни даде ключа, съответстващ на всеки код, и ще работи на американска клавиатура.

неподписан 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, / * Ляв Shift * / '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 0, / * Дясна смяна * / '*', 0, / * Alt * / ", 0, / * Caps lock * / 0,0,0,0,0,0,0,0,0,0, / * F1-F10 бутони * / 0, / * Num lock * / 0, / * Заключване на превъртането * / 0, / * Бутон за начало * / 0, / * Стрелка нагоре * / 0, / * Страница нагоре * / '-', 0, / * Лява стрелка * / 0, 0, / * Надясно стрелка * / '+', 0, / * Клавиш за край * / 0, / * Стрелка надолу * / 0, / * Страница надолу * / 0, / * Бутон за вмъкване * / 0, / * Клавиш за изтриване * / 0,0,0, 0, 0, 11, / * клавиши F12-F0 * / XNUMX};

http://gist.github.com/bf52085aec05f3070b65

Имаше и дефинирана функция, която получи фраза. Целта е просто по-лесен достъп до низовете от приложенията, които се нуждаят от него, в момента само един. Говоря за NextShellLite, намалена версия на възможната бъдеща обвивка, която NextDivel би имал. Целта на NextShellLite е само да осигури намалена обвивка за постепенно тестване на нови функционалности. Няма да поставя кода на черупката тук, но съм го включил в кода на NextDivel.

В момента тя не работи като отделна програма, а като функция, извикана от ядрото, главно защото все още не сме добавили опцията за стартиране на изпълними файлове. И разбира се, няколко снимки на това как черупката работи с новите функции за въвеждане на клавиатура.

NextShellLite


8 коментара, оставете своя

Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.

  1.   дарио каза той

    отличен преподавател! благодаря 🙂

  2.   PopArch каза той

    Истината е, че никога не съм следвал урока, защото в първата част той ми даде грешка при опит за компилация, но не помня за каква грешка ставаше дума

  3.   Котката на Лопес каза той

    Извинете за моето невежествено невежество ... от къде са написани тези кодове? От терминала ??

    1.    AdrianArroyoStreet каза той

      Кодовете са част от изходния код. Не го поставям пълен, защото в противен случай публикацията е изцяло код и нищо обяснение. Препоръчвам ви да прочетете уроците от самото начало, ако искате да го следвате. Можете също да проверите пълния изходен код тук (http://github.com/AdrianArroyoCalle/next-divel)

  4.   Kady каза той

    Как би било подобрението, така че да не настъпи преливане?

    1.    Плок каза той

      Кади, провери ли вече кода на хранилището? Там е установен максималният размер, както и функции за неговото управление, там можете да направите промяната в размера или да приложите разумен начин за освобождаване на буфера, когато той се насити
      Оставям линка, за да го проверите https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp

  5.   Нико каза той

    Здравейте много интересно, ще продължите ли с тази «поредица» от емулиране на Linus Torvals?
    Можете ли да препоръчате някаква книга, информация, за да можете да направите ядро ​​като това?

    Поздрави!

  6.   Отговори Vegan.Org каза той

    Здравей Благодаря за урока. Моля, можете ли да препоръчате книга за това, което сте създали и която не е "Операционни системи" от Tanenbaum? Благодаря много предварително.
    Поздрави.