Что скрывает спецификация USB?

16 Мар 2015

Что скрывает спецификация USB?

Традиционно, прерывание System Management Interrupt или SMI применяется разработчиками персональных платформ для реализации функциональности, которую UEFI firmware или BIOS желает «скрыть» от операционной системы. Указатель на процедуру обработки SMI имеет специальный статус. В отличие от всех остальных векторов прерываний, он не входит в состав системных таблиц векторов или дескрипторов прерываний, а находится в специальных регистрах процессора.

И конечно, инструкция запрета прерываний CLI не влияет на обработку SMI. При восприятии запроса SMI процессор переходит в System Management Mode (SMM) или режим управления системой. После выполнения процедуры обработки SMI, возврат в прерванную программу осуществляется специальной инструкцией RSM (Resume from System Management Mode). Режим SMM открывает неограниченный доступ к ресурсам платформы, что, кстати, вызывает интерес хакеров. Но сегодня не об этом.

Сценарий первый: эмуляция несуществующих ресурсов

Допустим, у нас есть современная платформа, снабженная клавиатурой USB, разъем PS/2 отсутствует. Это означает, что системный порт с адресом 0060h (Keyboard Data Register), посредством которого PS/2 клавиатура передает в систему коды нажатых клавиш, не поддерживается. Также допустим, что нам нужно, по ностальгии или объективной необходимости запустить на данной платформе некое устаревшее программное обеспечение, написанное в стиле MS-DOS, непосредственно читающее регистр Keyboard Data в расчете получить код нажатой клавиши. Что делать?

Опции Legacy USB Support и Port 60/64 Emulation в настройках UEFI BIOS
Рис 1. Опции Legacy USB Support и Port 60/64 Emulation в настройках UEFI BIOS

Конечно, включить опцию USB Legacy Support в CMOS Setup, разрешив эмуляцию PS/2 клавиатуры. Тогда при обращении программы к порту Keyboard Data, firmware платформы, а точнее процедура обработки SMI вмешивается в процесс чтения несуществующего порта и обеспечивает корректный результат операции. Сделать это можно двумя методами:

  1. Процедура обработки SMI изменяет контекст прерванной программы, в частности, код нажатой клавиши, полученный от USB клавиатуры, помещает в регистр AL, что прерываемой программой воспринимается как результат чтения порта.
  2. Процедура обработки SMI, используя специальные команды контроллера клавиатуры, помещает код клавиши в буфер контроллера, затем, модифицируя адрес возврата, заставляет прерванную программу повторить инструкцию чтения порта Keyboard Data. Такой вариант возможен только на платформах, где функциональность регистра Keyboard Data поддерживается хотя бы в минимальном виде.

Сценарий второй: сокрытие существующих ресурсов

Функционирование контроллера USB сопровождается формированием ряда системных событий, не характерных для контекста, в котором работает «старое» программное обеспечение. Сюда входит взаимодействие контроллера и драйвера. Последний в нашем случае входит в состав firmware платформы. В частности, имеет место периодическая генерация запросов на прерывание и доступ контроллера в режиме Bus Master к структурам в оперативной памяти: расписанию транзакций и передаваемым данным. Чтобы максимально изолировать данные события, для коммуникации между контроллером USB и firmware платформы используется прерывание SMI, как альтернатива классическому механизму прерываний.

Один из регистров контроллера xHCI предназначен для индивидуального разрешения и запрета ряда условий формирования SMI
Рис 2. Один из регистров контроллера xHCI предназначен для индивидуального разрешения и запрета ряда условий формирования SMI

Контакт 2 контроллера ASMEDIA ASM1142 задействован для системного сигнала SMI
Рис 3. Контакт 2 контроллера  ASMedia ASM1142 задействован для системного сигнала SMI

Резюме

Документация по самым современным реализациям хост-контроллеров USB 3.1 дает однозначный ответ — аппаратная база для обеспечения совместимости между «самым новым» и «самым старым» существует. Насколько полно разработчики платформ реализуют этот потенциал — покажет время…