Термальная угроза: мифы и реальность №2

Пример: программное управление вентилятором процессора

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и беспрепятственного взаимодействия программы с оборудованием при работе с предлагаемым примером, автор применил "древнюю" технологию отладки под DOS. Аргументация такого шага и рекомендации по организации рабочего места приведены в ранее опубликованной статье "64-битный режим под DOS: исследовательская работа № 1". Предлагаемый ассемблерный пример демонстрирует программное выключение вентилятора процессора. Перед выключением и последующим повторным включением выдаются сообщения, и ожидается нажатие клавиши пользователем. Процедура сопровождается визуализацией показаний тахометров, измеряющих обороты вентиляторов.

Каталог WORK\ содержит следующие файлы:

ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы под отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие добавление отладочной информации в EXE файл.

ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется EXE файл.

STOP_FAN.ASM – основной модуль программы.

SHOWRPM.INC – библиотека для визуализации показаний тахометров.

HARDWARE.INC – библиотека для чтения и записи регистров микросхемы MIO.

NUMBERS.INC – библиотека для вывода десятичных и шестнадцатеричных чисел в текстовом виде.

DELAY.INC – подпрограмма задержки, использующая системный таймер (прерывание IRQ0, DOS ticks).

STRINGWR.INC – подпрограмма вывода текстовой информации, использующая функции DOS.

MESSAGES.INC –текстовые строки для вывода сообщений.

Рассмотрим выполнение программы управления вентилятором процессора. Нумерация пунктов приведенного ниже алгоритма соответствует нумерации пунктов в комментариях к исходному тексту программы. См. файл WORK\stop_fan.asm.

1) Установка адреса стека, загрузка регистров SS и SP.

2) Установка видеорежима 3 (текст 80x25 символов) и очистка экрана.

3) Проверка типа процессора. Для распознавания процессора 386 (и выше) используется проверка доступности для перезаписи бита 14 регистра EFLAGS (это флаг NT=Nested Task). Так как программа использует 32-битные инструкции, данная проверка нужна для предупреждения "зависаний" при ошибочном запуске на компьютерах 286 и ниже.

4) Проверка режима работы процессора. Проверяется состояние бита 0 регистра MSW (это бит PE=Protection Enable). Так как программа использует непосредственный доступ к ресурсам платформы, она рассчитана на запуск из под "чистого" DOS в реальном режиме.

5) Проверка типа микросхемы MIO. Подпрограмма Enter_MIO_Config_8705 открывает доступ к конфигурационным регистрам микросхемы MIO, для этого в порт с адресом 002Eh передается специальная последовательность байтов: 87h, 01h, 55h, 55h. После этого порты 002Eh и 002Fh могут использоваться как порт индекса и порт данных соответственно. Для чтения регистра необходимо передать его адрес в порт 002Eh, затем прочитать значение из порта 002Fh. Для записи в регистр, его адрес записывается в порт 002Eh, а данные – в порт 002Fh. Используя указанный протокол, считываем конфигурационные регистры с индексами 0020h, 0021h, содержащие идентификатор микросхемы MIO, для чтения каждого регистра вызываем подпрограмму Indexed_Read_8705. После этого, закрываем доступ, записывая в регистр 02h значение 02h (установка бита Wait_for_Key в регистре Configure_Control). Это действие выполняет подпрограмма Exit_MIO_Config_8705. Прочитанный идентификатор сравниваем с константами 0587h и 1287h, которые идентифицируют микросхемы IT8705 и IT8712 соответственно.

Напомним, что для управления вентиляторами и считывания скорости их вращения используется подсистема аппаратного мониторинга. Данная версия программы поддерживает контроллеры мониторинга, входящие в состав микросхем MIO ITE8705 и ITE8712. Если контроллер другого типа, программа завершается с сообщением об ошибке. Подробности в [2], [3], [6], [7].

6) Определение базового адреса диапазона ввода-вывода, назначенного контроллеру мониторинга. Для этого считываем конфигурационные регистры 0060h, 0061h, содержащие адрес диапазона, а также регистр 0030h, бит 0 которого индицирует разрешение доступа к портам контроллера. Используем протокол доступа к конфигурационным регистрам, описанный в пункте 5. Перед считыванием перечисленных регистров, устанавливаем номер логического устройства LDN=4 (соответствующий контроллеру мониторинга), записывая значение 04h в регистр с индексом 07h. Отметим, что в 256-байтном блоке конфигурационных регистров, 48 регистров с номерами 00h-2Fh общие для всех логических устройств, а 208 регистров с номерами 30h-FFh раздельно реализованы для каждого устройства. Поэтому, в зависимости от записанного значения LDN, на диапазон регистров 30h-FFh подключаются блоки регистров различных логических устройств, входящих в состав микросхемы MIO.

Примечание

Данная программа не выполняет полную инициализацию контроллера и назначение адреса, поскольку это обычно делает BIOS материнской платы при старте. Если адрес не назначен, программа завершается с сообщением об ошибке. Описание полной процедуры инициализации микросхемы MIO от момента подачи питания до полнофункционального состояния контроллера мониторинга, приводится в [2], [3], [6], [7].

7) Визуализация адреса на экране. Проверка адреса. Значения адреса 0000h и FFFFh считаются некорректными. Регистры подсистемы аппаратного мониторинга, как и конфигурационные регистры микросхемы MIO, организованы по схеме индексного доступа, описанной в пункте 5. Порт индекса расположен по адресу X+5, порт данных по адресу X+6, где X=базовый адрес, полученный при выполнении пункта 6. Регистры описаны в [3], [7].

Отметим, что в большинстве платформ (хотя и не во всех) значение базового адреса устанавливается 0290h, при этом адрес индексного регистра 0295h, регистра данных – 0296h. Значение базового адреса устанавливается при настройке конфигурационных регистров микросхемы MIO. Эту настройку выполняет BIOS при старте платформы.

8) Проверка бита Start, индицирующего запуск подсистемы аппаратного мониторинга. Это бит 0 в регистре с индексом 0. Подробности в [3], [7].

9) Построение прямоугольника в нижней части экрана для отображения показаний тахометров.

10) Вывод сообщения "Press any key to STOP CPU FAN...". Вызывается подпрограмма Visual_All_RPM_8705, которая в цикле отображает показания тахометров и ожидает нажатия клавиши. Для считывания показаний тахометров используются регистры FAN Tachometer 1-3 Reading Registers (индексы 0Dh-0Fh), значение которых показывает, сколько импульсов внутреннего генератора отработано за время оборота вентилятора. Прочитанное значение должно быть умножено на коэффициент деления частоты. Для тахометров 1 и 2 код коэффициента деления считывается посредством регистра FAN Tachometer Divisor Register (индекс 0Bh). Для тахометра 3 коэффициент фиксирован. Скорость вращения в оборотах в минуту может быть вычислена по формуле

R=1350000/(T*N)

R=скорость вращения (оборотов в минуту)
T=Значения, прочитанные из регистров FAN Tachometer 1-3 Reading Registers
N=Коэффициент деления частоты, информация о котором доступна посредством регистров FAN Tachometer Divisor Register для вентиляторов 1 и 2. Для вентилятора 3 он фиксирован.

Указанное вычисление и визуализацию показаний тахометров выполняет подпрограмма Visual_One_RPM_8705. Подробности в [3].

Примечание

Согласно [3] фиксированное значение коэффициента деления частоты для вентилятора 3 равно 2. Согласно экспериментальным данным, полученным автором, оно равно 8. Видимо, в документе [3] допущена неточность.

11) Останов вентилятора процессора. В регистре FAN Controller Main Control Register (индекс=13h) обнуляем бит 0. Это выключает автоматическое управление вентилятором и делает возможным прямое управление вентилятором посредством битов регистра FAN_CTL Control Register. Затем, в регистре FAN_CTL Control Register (индекс=14h) инвертируем бит 0, что приводит к останову вентилятора. Заметим, что бит 7 того же регистра управляет полярностью битов 2-0. При "1" в бите 7, полярность битов 2-0 прямая (1=включен, 0=выключен), при "0" в бите 7 полярность обратная (0=включен, 1=выключен). Значения изменяемых регистров сохраняем для последующего восстановления.

Примечание

В документах [6], [7] допущена неточность. Бит 7 регистра FAN_CTL Control Register назван "Parity", правильно "Polarity".

12) Вывод сообщения "Press any key to RE-START CPU FAN...". Вызывается подпрограмма Visual_All_RPM_8705, которая в цикле отображает показания тахометров и ожидает нажатия клавиши.

13) Восстанавливаем исходные значения регистров FAN Controller Main Control Register (индекс=13h) и FAN_CTL Control Register (индекс=14h), сохраненные при выполнении шага 11. Это приводит к восстановлению работы вентилятора процессора.

14) Вывод сообщения "Press any key to exit...". Вызывается подпрограмма Visual_All_RPM_8705, которая в цикле отображает показания тахометров и ожидает нажатия клавиши.

15) Нормальное завершение программы. Очистка экрана, вывод сообщения о завершении программы и выход в ОС.

16) Аварийное завершение программы. Сюда передается управление, если возникли ошибки. При этом в регистре AX содержится указатель на текстовую строку, которая будет выведена в качестве сообщения об ошибке.

Заключение

В статье проанализирован один из возможных сценариев программного разрушения аппаратных средств. Материал будет полезен специалистам по аппаратному и системному программному обеспечению, интересующимся вопросами информационной безопасности и надежности вычислительной техники. Попутно детально рассмотрено программирование конфигурационных регистров микросхемы MIO и подсистемы аппаратного мониторинга, что будет полезным не только в контексте рассматриваемой темы. Ну а что касается "вирусописателей", то для них приведенная информация не является секретом, при подготовке материала были использованы только открытые источники, список которых прилагается. Автор надеется, что детальное обсуждение потенциальных уязвимостей и путей их устранения, сделает компьютерный мир более безопасным.

Источники информации

Электронные документы, доступные на сайте acpi.info.

1) Advanced Configuration and Power Interface Specification. Hewlett-Packard Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies Ltd., Toshiba Corporation. Revision 3.0.

Электронные документы, доступные на сайте ite.com.tw.

2) IT8705F/IT8705AF Simple Low Pin Count Input/Output (Simple LPC I/O) Preliminary Specification V0.4.
3) IT8705F Preliminary Environment Controller (EC) Programming Guide V0.3.
4) Errata V0.1 for IT8705F/IT8705AF V0.4. Document Number: ITPM-ER01-IT8705.
5) IT8705F Application Circuit. Document Number: IT-8705-CG-S01 V2.0.
6) IT8712F Environment Control – Low Pin Count Input/Output (EC-LPC I/O) Preliminary Specification V0.9.1.
7) IT8712F Preliminary Environment Controller (EC) Programming Guide V0.2.
8) IT8718F Environment Control – Low Pin Count Input/Output (EC-LPC I/O) Preliminary Specification V0.3.

Электронные документы, доступные на сайте winbond.com.tw.

9) W83627HF/F, W83627HG/G Winbond LPC I/O. Revision: A1.
10) Winbond LPC I/O W83627THF. Revision 1.0.
11) Winbond LPC I/O W83697HF, W83697HG. Revision: A1.
12) W83781D Winbond H/W Monitoring IC.

Электронные документы, доступные на сайте smsc.com.

13) LPC47M10x Preliminary. 100 Pin Enhanced Super I/O Controller with LPC Interface for Consumer Applications.
14) SMSC LPC47M10x Reference Design ASSY 6097 Rev. A1. Document Number: 6097.

Электронные документы, доступные на сайте datasheetarchive.com.

(Информация на данном сайте более полная, чем на "родных" сайтах производителей указанных микросхем.)

15) VIA VT82C686A South Bridge Datasheet. Revision 1.54. Для поиска документа набирать строку "VT82C686".
16) VIA VT82C686B South Bridge Datasheet. Revision 1.71. Для поиска документа набирать строку "VT82C686".

Взято с http://www.xakep.ru/post/49070/default.asp


Ведете ли вы блог?

Да
Нет
Планирую


Результаты опроса

Новостной блок