legal note
IC Book © 2001

hardware
software

support
buy

Home page
   




Press
Резидентный термометр
 


Об использовании POST-карты

Для того чтобы процесс визуализации температуры не зависел от текущего ви­де­о­ре­жима и состояния видеоадаптера, занимал минимум процессорного вре­ме­ни, не требовал обращения к функциям операционной системы и BIOS, а так­же не искажал содержимое экрана, автор применил вывод значений тем­пе­ра­ту­ры на POST-карту. Как известно, основное назначение POST-карты состоит в ото­бра­же­нии кодов, которые BIOS выдает в диагностический порт 80h для вы­яв­ле­ния причин "нестарта" компьютера. Вместе с тем, данное устройство мо­жет ока­зать­ся полезным и для ряда альтернативных применений, от банальной ус­та­нов­ки конт­роль­ных точек в отлаживаемой программе до настоящего технического "шпи­о­нажа".

При расширении функциональности предлагаемой программы, воз­мож­нос­тей рядовой POST-карты может оказаться недостаточно. В своих экспериментах автор использовал устройство IC80 v5.0 производства компании IC Book Labs, опи­санное в [20]. Данное устройство обладает следующими преимуществами, су­щес­твен­ными для наших экспериментов:

1) Наличие 16-битного индикатора позволит, например, выводить тем­пе­ра­ту­ры для двух ядер процессора или какие-либо дополнительные параметры, на­при­мер VID-код, который у современных процессоров, как известно, изменяется в зависимости от загрузки.

2) Возможность назначения адреса диагностического порта позволяет при необходимости эффективно обходить аппаратные и программные конфликты. Ра­зу­ме­ется, при переключении POST-карты на другой адрес, следует внести со­от­вет­ству­ю­щее изменение и в программу.

Отметим, что большинство POST-карт используют 8-битный порт с фик­си­ро­ван­ным адресом 80h, а также имеют проблемы совместимости с ря­дом ма­те­рин­ских плат и чипсетов.

Замечания по совместимости

Как было сказано выше, системные регистры, используемые для чтения тем­пе­ра­ту­ры, имеют различную архитектуру у процессоров различных моделей. Пол­но­функ­циональная программа, использующая данные ресурсы, должна со­дер­жать достаточно большой набор процедур поддержки под каждую модель про­цес­со­ра. Поэтому мы рассмотрим только два частных случая, по одному для про­цес­со­ров Intel и AMD. Публикуя исходные тексты, автор предоставляет читателю по­лу­фабрикат, в который можно добавить поддержку интересующих про­цес­со­ров. Здесь будет полезен список документации, приведенный в конце ста­тьи.

Предлагаемый пример написан для выполнения в среде DOS. Так сделано для упрощения отладки и обеспечения монопольного и беспрепятственного до­сту­па к оборудованию. Автор в первую очередь ставил задачу отладить вза­и­мо­дей­ствие с системными регистрами процессора, используемыми для управления тем­пе­ратурным режимом. При наличии соответствующих навыков, несложно адап­ти­ро­вать данную программу под любую ОС или встроить в BIOS. Пред­по­ла­га­ет­ся, что читатель знаком с программированием на языке ас­семб­ле­ра для 16-ти и 32-битной архитектуры x86.

Описание к исходным текстам

В каталоге WORK находятся исходные тексты программы, которая пе­ре­хва­ты­ва­ет прерывание от системного таймера (вектор INT8 соответствует ап­па­рат­но­му пре­рыванию IRQ0), становится резидентной и около 2 раз в секунду выводит зна­че­ние текущей температуры процессора в диагностический порт.

Drivers Архив программы "Резидентный термометр"

Программа, де­мон­стри­ру­ю­щая возможности использования регистров про­цес­со­ра для оп­ре­де­ле­ния температурных параметров, доступна поль­зо­ва­те­лям в следующей комп­лек­та­ции:

 

Файл

Описание

 

ASM4TD.BAT

обеспечивает ассемблирование, линковку и запуск про­г­раммы под отладчиком

 

ASM.BAT

обеспечивает ассемблирование, линковку и по­лу­че­ние COM файла

 

TCPU.ASM

основной модуль

 

DOSMSG.INC

подпрограмма вывода сообщений с использованием функ­ций DOS

 

H1.INC

подпрограмма чтения температуры для процессоров AMD Family 0Fh

 

H2.INC

подпрограмма чтения температуры для процессоров Intel Family 06h Model 0Fh

 

H3.INC

зарезервированный файл для ведения списка под­дер­живаемых процессоров


Рассмотрим структуру и выполнение основного модуля (файл TCPU.ASM). Ну­мерация пунктов в приведенном описании соответствует нумерации в ис­ход­ном текс­те программы.

1) Выполняем безусловный переход на процедуру инициализации (метка Non_­Resident, пункт 3). Эта процедура выполняется один раз при запуске про­г­рам­мы и расположена в конце выполняемого файла, что позволяет ис­клю­чить ее из резидентной части и сократить размер последней.

2) Резидентный блок, "перепрыгиваемый" при инициализации. На эту про­це­ду­ру устанавливается вектор прерывания от системного таймера INT8, после чего она запускается с периодичностью около 18.2 Hz. Процедура считывает тем­пе­ра­ту­ру процессора, преобразует результат из двоичного кода в двоично-десятичный и выводит результат в POST-карту (порт 80h). При ошибке выводится код FFh. Для чтения температуры, в соответствии с моделью процессора, выбирается одна из подпрограмм. Адрес подпрограммы подготавливается в cs:[Handler_Offset] при ини­циализации. Для снижения утилизации процессора, указанные действия вы­пол­ня­ют­ся один раз на каждые восемь запусков прерывания от таймера, то есть с частотой около 18.2/8=2.2 Hz, когда биты 2-0 ячейки 0:46Ch инкрементируемой по каждому прерыванию от таймера, равны 000b.

3) Начало инициализации, выводим текстовую строку.

4) Проверяем поддержку 32-битной системы команд. Это нужно для того, что­бы при попытке запуска на очень старых компьютерах программа не "за­ви­са­ла", а вы­хо­ди­ла с сообщением об ошибке. Если бит 14 регистра флагов NT(Nested Task) доступен для перезаписи, делаем вывод, что процессор 80386 или выше.

5) Проверяем поддержку инструкции CPUID. Если бит 21 регистра флагов до­сту­пен для перезаписи, CPUID поддерживается.

6) Выполняем функцию 0 инструкции CPUID для получения Vendor String и де­тек­ти­ро­ва­ния производителя процессора.

7) Если Vendor String = "AuthenticAMD", переходим к пункту 8, иначе к пункту 11.

8) Проверяем Family для процессора AMD. Текущая версия программы под­дер­жи­ва­ет процессоры Family=0Fh.

9) Bus=0, Device=18h, Function=3, блока регистров с параметрами Vendor ID = 1022h, Device ID = 1103h. Это регистровый блок Miscellaneous Control, со­дер­жа­щий ресурсы, к которым будет обращаться процедура чтения температуры про­цес­со­ра.

10) Заносим в регистр AX адрес подпрограммы чтения температуры для дан­но­го процессора и переходим к пункту 16.

11) Если Vendor String = "GenuineIntel", переходим к пункту 12, иначе – к 15.

12) Проверяем Family и Model для процессора Intel. Текущая версия про­г­рам­мы поддерживает процессоры Family=06h, Model=0Fh.

13) Проверяем поддержку DTS (Digital Thermal Sensor), используя функцию 6 инструкции CPUID.

14) Заносим в регистр AX адрес подпрограммы чтения температуры для дан­но­го процессора и переходим к пункту 16.

15) Метка Next_2 зарезервирована для добавления поддержки новых про­цес­со­ров.

16) Устанавливаем адрес процедуры чтения температуры в соответствии с мо­делью процессора.

17) Проверяем, что процессор работает в Real Mode, то есть программа не запущена из-под Windows и отсутствуют менеджеры памяти, такие как EMM386 или QEMM. Это гарантирует нам беспрепятственный доступ к аппаратным ре­сур­сам.

18) Вызываем процедуру чтения температуры (ту же, что будет запускаться по прерыванию от таймера) и проверяем результат.

19) Перехватываем прерывание от таймера, предварительно сохранив ис­ход­ное значение вектора.

20) Выводим сообщение об успешном запуске, оставляем в памяти ре­зи­дент­ный фрагмент (процедуру обработки прерывания от таймера) и выходим в ОС.

21) Процедура вывода сообщения об ошибке и завершения программы без ре­зидентной установки. Сюда управление передается при возникновении оши­бок, при этом регистр BP содержит адрес строки сообщения об ошибке.


Предыдущая страница   Предыдущая страница Следующая страница   Следующая страница






about
press


вверх