Protected Mode Keyboard Access on x86 Assembly
I'm working on keyboard input for a very basic kernel that I'm developing and I'm completely stuck. I can't seem to find any information online that can show me the information I need to know.
Мое ядро сейчас работает в защищенном режиме, поэтому я не могу использовать процедуры клавиатуры в реальном режиме без перехода в реальный режим и обратно, чего я стараюсь избегать. Я хочу получить доступ к моей клавиатуре из защищенного режима. Кто-нибудь знает как это сделать? Единственное, что я обнаружил до сих пор, это то, что это связано с непосредственным общением с контроллером с использованием входных / выходных портов, но помимо этого я в тупике. Это, конечно, не то, что возникает очень часто. Обычно в руководствах по сборке предполагается, что вы работаете под операционной системой.
Я новичок в сборке x86, поэтому я просто ищу хорошие ресурсы для работы со стандартным оборудованием из защищенного режима. Я компилирую исходный код Assembly с помощью NASM и связываю его с исходным кодом C, скомпилированным с DJGPP. Какие-либо предложения?
3 ответа
Класс операционных систем MIT имеет много хороших ссылок. В частности, ознакомьтесь с ресурсами Адама Чапвеска по программированию клавиатуры и мыши.
Короче говоря, да, вы будете использовать необработанные порты ввода / вывода, для которых требуется либо работа в режиме ядра, либо установка битов разрешения ввода / вывода (IOPL) в регистре EFLAGS. Смотрите эту страницу для более подробной информации о разрешениях ввода / вывода.
Вы работаете со стандартным устаревшим оборудованием одинаковым образом в реальном и защищенном режимах. В этом случае вы хотите общаться с 8042 на портах ввода / вывода от 0x60 до 0x6f, которые, в свою очередь, будут общаться с контроллером в клавиатуре на другом конце провода.
Быстрый поиск в Google нашел меня интересным ресурсом по адресу http://heim.ifi.uio.no/~stanisls/helppc/8042.html (для 8042) и http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html (для клавиатуры).
Если вы к этому не привыкли, вы общаетесь с компонентами на портах ввода / вывода через коды операций IN (чтение) и OUT (запись), которые получают номер порта ввода / вывода (16-битное значение) и значение для быть прочитанным или записанным (8, 16 или 32 бита). Обратите внимание, что размер прочитанного или записанного важен! Запись 16 битов в то, что ожидает 8 битов (или наоборот), является рецептом катастрофы. Привыкайте к этим кодам операций, так как вы будете их часто использовать (это единственный способ общаться с некоторыми периферийными устройствами, в том числе с несколькими необходимыми; другие периферийные устройства используют отображаемый в памяти ввод / вывод (MMIO) или DMA с мастерингом шины).
Контроллер 8042 PS/2 выглядит как простейшая возможность.
Учебник по OSZUR11 OS содержит рабочий пример по https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c
Просто:
sudo apt-get install build-essential qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
git clone git://git.code.sf.net/p/oszur11/code oszur11
cd oszur11/Chapter_06_Shell/04_Makepp
make qemu
Протестировано на Ubuntu 14.04 AMD64.
Мое зеркало GitHub (вышестоящий неактивный): https://github.com/cirosantilli/oszur11-operating-system-examples
Не воспроизводить его здесь, потому что код слишком длинный, будет обновляться, если мне удастся выделить часть клавиатуры в минимальном примере.