Доступ к клавиатуре с защищенным режимом на сборке x86

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

Вы работаете со стандартным устаревшим оборудованием таким же образом в реальных и защищенных режимах. В этом случае вы хотите поговорить с 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 (чтение) и вывода (записи), которые получают номер порта ввода-вывода (16-разрядное значение) и значение для чтения или записи (8, 16 или 32 бит). Обратите внимание, что размер, считанный или написанный, важен! Запись 16 бит на то, что ожидает 8 бит (или наоборот), является рецептом для катастрофы. Привыкайте к этим кодам операций, так как вы будете использовать их много (это единственный способ поговорить с некоторыми периферийными устройствами, в том числе с несколькими существенными, другие периферийные устройства используют I/O (MMIO с памятью) или DMA с шиной.

Ответ 3

Контроллер 8042 PS/2 выглядит как самая простая возможность.

В учебнике OS ouszur11 содержится рабочий пример в 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 mirror (upstream inactive): https://github.com/cirosantilli/oszur11-operating-system-examples

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