Враћамо се на серију водича о томе како створити сопствени оперативни систем. Претпостављам да ће вам се ово поглавље свидети јер коначно можемо да комуницирамо са нашим оперативним системом. Данас ћемо прочитати унос са тастатуре. Због тога је шема слична оној са тајмером. Ионако морамо користити ИРК-ове, па ћемо започети исто као код тајмера.
НД_ИРК_ИнсталлХандлер (1, & НД_Кеибоард_Хандлер);
Наш руковалац тастатуром је, међутим, нешто сложенији јер читамо тастере и депонујемо их у бафер.
ектерн "Ц" воид НД_Кеибоард_Хандлер (струцт регс * р) {унсигнед цхар сцанцоде = НД :: Кеибоард :: ГетЦхар (); иф (сцанцоде! = 255) {НД :: Сцреен :: ПутЦхар (сцанцоде); стрингБуффер [стрингПос] = код за скенирање; стрингПос ++; }}
http://gist.github.com/634afddcb3e977ea202d
Можемо провјерити како зовемо функцију која се зове НД :: Кеибоард :: ГетЦхар. Тамо добијамо знак и онда ако то није празан знак (овде сам користио 255, морали бисмо да користимо бољи систем) стављамо лик на екран и чувамо га у једноставном баферу знакова (ово је такође предмет побољшања, тренутни систем може се прелити).
нсигнед цхар НД :: Кеибоард :: ГетЦхар () {унсигнед цхар сцанцоде; сцанцоде = (непотписани знак) НД :: Портс :: ИнпутБ (0к60); иф (сцанцоде & НД_КЕИБОАРД_КЕИ_РЕЛЕАСЕ) {ретурн 255; } елсе {повратак ен_УС [сцанцоде]; }} цхар * НД :: Кеибоард :: ГетСтринг () {вхиле (стрингБуффер [стрингПос-1]! = '\ н') {} стрингПос = 0; ретурн стрингБуффер; }
http://gist.github.com/2d4f13e0b1a281c66884
Овде можемо видети како се добија тастер који је притиснут. На 0к60 увек ће бити притиснут последњи тастер. У ствари, може се читати директно без употребе ИРК-а, али тада нећемо знати како да идентификујемо када је дошло до промене. Тамо проверавамо операцијом АНД да ли код који смо добили одговара кључу који је објављен.
У том случају враћамо 255 (јер ћемо то касније игнорисати), а иначе је тастер притиснут. У том случају враћамо положај низа званог ен_УС. Које информације садржи овај низ? Овај низ бисмо назвали мапом тастера или мапом знакова. Као што ћете знати, различити језици имају различите тастатуре и нису подржани јер преписују тастере. Тако ће нам ен_УС дати кључ који одговара сваком коду и радиће на америчкој тастатури.
непотписани цхар ен_УС [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ б ',' \ т ',' к ',' в ',' е ',' р ',' т ',' и ',' у ',' и ',' о ',' п ',' [','] ',' \ н ', 0, / * Цтрл * /' а ',' с ',' д ',' ф ',' г ', 'х', 'ј', 'к', 'л', ';', '\' ',' ``, 0, / * Лефт Схифт * / '\\', 'з', 'к', 'ц', 'в', 'б', 'н', 'м', ',', '.', '/', 0, / * Десни помак * / '*', 0, / * Алт * / '', 0, / * Цапс лоцк * / 0,0,0,0,0,0,0,0,0,0, / * Ф1-Ф10 тастери * / 0, / * Нум лоцк * / 0, / * Закључавање помицања * / 0, / * Тастер Почетна * / 0, / * Стрелица нагоре * / 0, / * Страница горе * / '-', 0, / * Стрелица улево * / 0, 0, / * Стрелица удесно * / '+', 0, / * Тастер за завршетак * / 0, / * Стрелица надоле * / 0, / * Страница надоле * / 0, / * Тастер за уметање * / 0, / * тастер за брисање * / 0,0,0, 0, 0, 11, / * тастери Ф12-Ф0 * / XNUMX};
http://gist.github.com/bf52085aec05f3070b65
Такође је постојала дефинисана функција која је добила фразу. Сврха је једноставно приступити стринговима из апликација којима је потребна, тренутно само једној. Говорим о НектСхеллЛите, смањеној верзији могуће будуће љуске коју би НектДивел имао. Сврха НектСхеллЛите-а је само да обезбеди смањену љуску ради постепеног тестирања нових карактеристика. Нећу овде стављати схелл код, али сам га уврстио у НектДивел код.
Тренутно не ради као засебан програм, већ као функција коју позива језгро, углавном зато што још увек нисмо додали опцију за покретање извршних датотека. И наравно, неколико слика како љуска ради са новим функцијама за унос тастатуре.
одличан тутор! хвала 🙂
Истина је да никада нисам следио туторијал јер ми је у првом делу дао грешку приликом покушаја компајлирања, али не сећам се о којој грешци је реч
Жао ми је због мог глупог незнања ... одакле су написани ови кодови? Са терминала ??
Кодови су део изворног кода. Не стављам га у потпуности, јер је у супротном пошта сав код и нема објашњења. Препоручујем вам да упутства прочитате од почетка ако желите да их пратите. Пун изворни код такође можете проверити овде (http://github.com/AdrianArroyoCalle/next-divel)
Како би било побољшање да се не догоди преливање?
Кади, јеси ли већ проверио код спремишта? Тамо је утврђена максимална величина, као и функције за контролу, тамо можете извршити промену величине или применити разуман начин да ослободите бафер када постане засићен
Остављам вам везу да бисте је проверили https://github.com/AdrianArroyoCalle/next-divel/blob/master/src/start/ND_Keyboard.cpp
Здраво врло занимљиво, да ли ћете наставити са овом «серијом» опонашања Линус Торвалс-а?
Можете ли препоручити било коју књигу и информације како бисте могли да направите овакав кернел?
Поздрав!
Здраво. Хвала на лекцији. Молим вас, можете ли препоручити књигу о овоме коју сте направили и која није „Оперативни системи“ компаније Таненбаум? Хвала вам пуно унапред.
Поздрав.