Вывод на POST-индикатор температуры проца средствами операционной системы.

для раздела Блоги
[версия 1 от 23.09.2004]
(P80h mainboard BIOS mod)

В этой заметке я постараюсь дать краткое описание небольшой модификации, позволяющей стандартными средствами операционной системы выводить на POST-индикатор значения температуры процессора. На моем домашнем компьютере это "новшество" работает уже больше полугода (с марта 2004, материнка EPoX 8RDA). Проблем замечено не было.

Думаю, очевидно, что данная модификация интересна прежде всего для владельцев материнских плат с POST-индикатором на борту (многие EPoX, некоторые A-Bit), а также для обладателей POST-карт в PCI/ISA исполнении.

Суть усовершенствования -- модификация AML-кода, являющегося частью ACPI-таблиц, хранящихся в образе BIOS материнской платы. AML-код после прохождения POST оказывается в оперативной памяти компьютера и используется ACPI-драйвером операционной системы. Этот код является прослойкой между драйвером и железом. В частности, он описывает способ получения драйвером информации о температуре процессора посредством специально предусмотренного метода RTMP. Этот метод периодически вызывается драйвером, чтобы узнать, не превысила ли температура предельные значения. Воспользуемся этим фактом: после модификации упомянутого метода температура с такой же периодичностью будет выводиться и на POST-индикатор.

Но обо всем по-порядку.

Этап 1. Извлечение AML-кода и декомпиляция его в ASL-код. Этот этап подробно описан в предыдущей статье.
В полученный на этом этапе ASL-код и будем вносить изменения.

Этап 2. Определение региона P80H. Фактически производится описание порта 80h. Если вы немного знакомы с ассемблером, то наверняка знаете, что для вывода какого-либо шестнадцатеричного числа на POST-индикатор достаточно вывести это число в порт с номером 80h.

Для удобства объявим область P80H в самом начале.
Участок кода до внесения изменений:
/*

* Intel ACPI Component Architecture
* AML Disassembler version 20040211
*
* Disassembly of DSDT, Sun Mar 21 20:46:44 2004
*/

DefinitionBlock ("DSDT.aml", "DSDT", 1, "NVIDIA", "AWRDACPI", 4096)
{
Scope (\_PR)
{
Processor (\_PR.CPU0, 0x00, 0x00000000, 0x00) {}
}
Участок кода после внесения изменений:
/*

* Intel ACPI Component Architecture
* AML Disassembler version 20040211
*
* Disassembly of DSDT, Sun Mar 21 20:46:44 2004
*/

DefinitionBlock ("DSDT.aml", "DSDT", 1, "NVIDIA", "AWRDACPI", 4096)
{

OperationRegion (PORT, SystemIO, 0x80, 0x01)
Field (PORT, ByteAcc, NoLock, Preserve)
{
P80H, 8
}


Scope (\_PR)
{
Processor (\_PR.CPU0, 0x00, 0x00000000, 0x00) {}
}
Изменения в данном и последующих фрагментах кода выделены красным.

Этап 3. Модификация процедуры (метода) RTMP, передающего ACPI-драйверу значение температуры процессора. Его задача: получение от микросхемы ввода-вывода информации о температуре процессора в градусах Цельсия и преобразование ее в в Кельвины.

Логично предположить, что этот метод сильно зависит от модели микросхемы ввода-вывода. Для большинства чипов производства Winbond (W83627(T)HF, W83637HF, W83697HF и др.) эта процедура будет выглядеть следующим образом (оригинальный код метода):
    Method (RTMP, 0, NotSerialized)

{
Store (GBYT (0x4E), Local0)
Or (Local0, 0x01, Local1)
SBYT (0x4E, Local1)
Store (GBYT (0x50), Local1)
Store (GBYT (0x51), Local2)
ShiftLeft (Local1, 0x08, Local1)
Or (Local1, Local2, Local3)
ShiftRight (Local3, 0x07, Local3)
ShiftLeft (Local3, 0x02, Local1)
Add (Local3, Local1, Local3)
Add (Local3, 0x0AAC, Local3)
If (LGreater (Local3, 0x0E8A))
{
Store (0x0AAC, Local3)
}

SBYT (0x4E, Local0)
Return (Local3)
}

Код метода после изменений (выделены красным):
    Method (RTMP, 0, NotSerialized)

{
Store (GBYT (0x4E), Local0)
Or (Local0, 0x01, Local1)
SBYT (0x4E, Local1)
Store (GBYT (0x50), Local1)
Store (GBYT (0x51), Local2)
ToBCD (Local1 , P80H )
ShiftLeft (Local1, 0x08, Local1)
Or (Local1, Local2, Local3)
ShiftRight (Local3, 0x07, Local3)
ShiftLeft (Local3, 0x02, Local1)
Add (Local3, Local1, Local3)
Add (Local3, 0x0AAC, Local3)
If (LGreater (Local3, 0x0E8A))
{
Store (0x0AAC, Local3)
}

SBYT (0x4E, Local0)
Return (Local3)
}
Суть внесенных изменений: значение температуры (например, 45C) преобразуется в шестнадцатеричное число, состоящее из тех же цифр (45h), и отсылается в порт номер 80h, т.е. выводится на POST-индикатор.

Этап 4. Компиляция ASL->AML, тестирование, встраивание в образ БИОС'а и прошивка. Эти этапы подробно описаны в предыдущей статье.
(К моему большому сожалению, не имею возможности перенаправить Вас к конкретному абзацу, т.к. дорогая администрация откровенно проигнорировала мою просьбу ввести закладки на персональных страницах. Так что придется Вам поработать колесом мыши, чтобы найти нужное место.)

Как видите, ничего гениального в предложенной модификации нет. Но эффект от нее на лицо, точнее, индикатор.

Кто-то, возможно, заявит, что все это на любителя:

1. Конечно же, можно выводить значение температуры на POST-индикатор и кучей других способов, например, с помощью MBM или собственноручно написанной утилитки. Но это все требует дополнительных затрат времени и энергии (пусть и небольших) со стороны пользователя, особенно после переустановки ОС.

2. Возможно, кому-то просто нет нужды выводить показания на индикатор, например, если сам индикатор на материнке и материнка вкручена в корпус.
Но если сам индикатор выведен на морду компа (есть такие PCI модели) или материнка постоянно лежит на столе (например, как у меня дома и на работе), то почему бы и не вывести значение температуры на видное место. Кстати, выводить можно не только температуру. Но это уже зависит от фантазии и запросов человека, занимающегося модифицикацией.


Кстати, можно считать, что история описанного здесь способа модификации биоса началась с моей безответной просьбы к apple_rom'у. Тогда, правда, я и сам слабо представлял как реализовать то, о чем просил Теперь же, особенно учитывая тот факт, что apple_rom обещал ввести в BIOS Patcher поддержку PNow! через ACPI, тогдашняя моя просьба уже не кажется простым фантазерством.

Вадим Карпов


PS: Статья написана спонтанно, меньше чем за два часа. Наверняка в ближайшем будущем придется кое-что подкорректировать. Так что сильно ногами не пинайте

PPS: Должен честно сознаться, что способ описания региона P80h подглядел в биосе к ноутбуку iRU Intro 1214. Описание методов глянул в спецификации по ACPI.

---
Обсудить эту и другие статьи/записи с моей персональной страницы можно в соответствующей ветке конференции.
Подпишитесь на наш канал в Яндекс.Дзен или telegram-канал @overclockers_news - это удобные способы следить за новыми материалами на сайте. С картинками, расширенными описаниями и без рекламы.

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают