Эмуляция Линуса Торвальдса: создайте свою собственную операционную систему с нуля (VIII)

Вернемся к серии руководств по созданию собственной операционной системы. Я полагаю, вам очень понравится эта глава, потому что мы наконец-то можем взаимодействовать с нашей операционной системой. Сегодня мы прочитаем ввод с клавиатуры. Для этого схема аналогична таймеру. Мы все равно должны использовать IRQ, поэтому мы начнем так же, как с таймером.

ND_IRQ_InstallHandler (1, & ND_Keyboard_Handler);

Однако наш обработчик клавиатуры несколько сложнее, поскольку мы считываем ключи и помещаем их в буфер.

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

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

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

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

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

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

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

символ без знака en_US [128] = {0,27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0 ',' - ',' = ',' \ b ',' \ t ',' q ',' w ',' e ',' r ',' t ',' y ',' u ',' я ',' 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.

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

СледующийShellLite


Добавить в качестве предпочтительного источника в Google