Автор: wiki.rom.by , 1 февраля 2008
Содержимое данного поля является приватным и не предназначено для показа.

BBCode (added in Drupal 11)

  • HTML-теги не обрабатываются и показываются как обычный текст
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.

maco

10 лет 2 месяца назад

[OFF]-->[/OFF]

Материал из Wiki.


<!-- start content -->

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


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


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


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










Содержание








Этап 1. Извлечение AML-кода



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





Этап 2. Определение региона P80H



Определение региона 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)
{
<font color="#993366">OperationRegion (PORT, SystemIO, 0x80, 0x01)
Field (PORT, ByteAcc, NoLock, Preserve)
{
P80H, 8
}</font>
Scope (\_PR)
{
Processor (\_PR.CPU0, 0x00, 0x00000000, 0x00) {}
}

Изменения в данном и последующих фрагментах кода выделены <font color="#993366">красным</font>.





Этап 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)
}

Код метода после изменений (выделены <font color="#993366">красным</font>):


Method (RTMP, 0, NotSerialized)
{
Store (GBYT (0x4E), Local0)
Or (Local0, 0x01, Local1)
SBYT (0x4E, Local1)
Store (GBYT (0x50), Local1)
Store (GBYT (0x51), Local2)
<font color="#993366">ToBCD (Local1 , P80H )</font>
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)
}

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





Этап 4. Компиляция ASL->AML



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


Вадим Карпов