Есть ли способ эмулировать устройство ввода-вывода в UEFI?

Есть ли способ эмулировать устройство ввода-вывода (например, контроллер super IO) в драйвере среды выполнения UEFI, работающем за ОС?

1 ответ

Решение

Вам нужно будет создать драйвер SMM, который будет перехватывать определенные диапазоны ввода / вывода, генерируя SMI, которые направят эти обращения к вашему драйверу. Значения, записанные в захваченные диапазоны ввода / вывода, могут быть получены драйвером из области сохранения состояния процессора и обработаны соответствующим образом конечным автоматом вашего эмулируемого устройства. Значения, которые ОС считывает из захваченного диапазона ввода-вывода, будут возвращаться вашим драйвером путем замены сохраненного состояния регистра EAX в состоянии сохранения ЦП, где это значение возвращается в системах x86.

Этот метод широко использовался устаревшими BIOS для эмуляции контроллера клавиатуры 8042 и поддержки USB HID-устройств на уровне BIOS (AKA Legacy USB). Обратите внимание, что SMM доступен только в системах x86 и сильно зависит от платформы, т.е. ваш драйвер может работать на одной платформе, но не на другой. В современных реализациях UEFI существует хороший уровень абстракции SMM, что способствует масштабируемости кода SMM, но возможности перехвата ввода-вывода различаются для разных наборов микросхем. Возможности эмуляции на основе SMM были доведены до крайности в процессорах AMD Geode, где мы эмулировали большинство периферийных устройств ПК, не только SuperIO, но и вплоть до аудио и видео контроллеров.

Другие вопросы по тегам