Защищенный режим доступа к клавиатуре на сборке x86 - PullRequest
14 голосов
/ 20 октября 2008

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

Мое ядро ​​сейчас работает в защищенном режиме, поэтому я не могу использовать процедуры клавиатуры в реальном режиме без перехода в реальный режим и обратно, чего я стараюсь избегать. Я хочу получить доступ к моей клавиатуре из защищенного режима. Кто-нибудь знает как это сделать? Единственное, что я обнаружил до сих пор, это то, что он включает в себя разговор с контроллером, напрямую использующим входные / выходные порты, но помимо этого я в тупике. Это, конечно, не то, что возникает очень часто. Обычно в руководствах по сборке предполагается, что вы работаете под операционной системой.

Я очень новичок в сборке x86, поэтому я просто ищу хорошие ресурсы для работы со стандартным оборудованием из защищенного режима. Я компилирую исходный код Assembly с помощью NASM и связываю его с исходным кодом C, скомпилированным с DJGPP. Есть предложения?

Ответы [ 3 ]

12 голосов
/ 20 октября 2008

Класс операционных систем MIT имеет много хороших ссылок. В частности, ознакомьтесь с ресурсами Адама Чапвеска по программированию клавиатуры и мыши.

Короче говоря, да, вы будете использовать необработанные порты ввода / вывода, для которых требуется либо работа в режиме ядра, либо установка битов разрешения ввода / вывода (IOPL) в регистре EFLAGS. См. эту страницу для получения более подробной информации о разрешениях ввода / вывода.

3 голосов
/ 20 октября 2008

Вы работаете со стандартным устаревшим оборудованием одинаково в реальном и защищенном режимах. В этом случае вы хотите общаться с 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 для мастеринга шины).

0 голосов

Контроллер 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.

Зеркало My GitHub (восходящий неактивен): https://github.com/cirosantilli/oszur11-operating-system-examples

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

...