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

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

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

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


person Nicholas Flynt    schedule 20.10.2008    source источник
comment
Привет, я знаю, что это старый вопрос, но можете ли вы отредактировать свой вопрос с помощью решения или взглянуть на мой вопрос stackoverflow.com/questions/22744624/? Спасибо   -  person Unix von Bash    schedule 30.03.2014


Ответы (3)


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

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

person Adam Rosenfield    schedule 20.10.2008
comment
Ура!!! Я заставил его работать благодаря этим страницам. Ты потрясающий, и я бы проголосовал за тебя 10 раз, если бы мог. Теперь мне просто нужно преобразовать скан-коды в ASCII, но я, вероятно, смогу это сделать (и, кроме того, вывод скан-кодов на экран выглядит очень аккуратно!) Большое спасибо! - person Nicholas Flynt; 20.10.2008
comment
Ссылка MIT не работает, вероятно, обновлено до: ocw.mit.edu/courses/electrical-engineering-and-computer-science/ - person Ciro Santilli 新疆再教育营六四事件ۍ 20.10.2015

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

person CesarB    schedule 20.10.2008
comment
Это хорошая информация, однако я обнаружил, что мне нужно разговаривать с портами 0x60 и ox64, а не с 0x6F. Вся документация, кажется, тоже указывает на это. Возможно опечатка? - person Nicholas Flynt; 21.10.2008
comment
Это порты от 0x60 до 0x6f (посмотрите / proc / ioports на любой машине x86 Linux). Из них фактически используются 0x60 и 0x64. - person CesarB; 22.10.2008
comment
Ссылки мертвы, но они есть у машины обратного пути: https://web.archive.org/web/20150503041658/http://heim.ifi.uio.no/~stanisls/helppc/keyboard_commands.html - person Ciro Santilli 新疆再教育营六四事件ۍ 20.10.2015

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

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 20.10.2015