Содержание статьи
Для каждого канала может быть установлен номер используемой линии запроса на
прерывание. Перед установкой, программное обеспечение должно проверить битовое
поле Interrupt Routing Capability, на предмет допустимости использования
данной линии данным каналом.
Дополнительное удобство обеспечивает режим Legacy Replacement Route,
устанавливающий поддержку "частного случая" переопределения использования линий
запросов на прерывание:
Канал 0 HPET использует Legacy IRQ0, вместо канала 0 таймера Intel 8254
Канал 1 HPET использует Legacy IRQ8, вместо Real Time Clock (RTC).
Режим FSB Interrupt Route позволяет таймеру генерировать прерывания в
виде сообщений, передаваемых непосредственно процессору (Local APIC) на шину
Front Side Bus, в обход контроллеров прерываний PIC 8259 и I/O APIC. Физически,
сообщения представляют собой циклы записи в специальный регион памяти, в котором
находятся memory-mapped регистры Local APIC. Спецификация предусматривает данный
режим, но на сегодня, большинство реализаций HPET его не поддерживают.
HPET MMIO регион имеет следующий формат.
Расшифровка поля Type.
RO (Read Only) – регистр доступен только для чтения
R/W (Read/Write) – регистр доступен для чтения и записи
R/WC (Read/Write Clear) – регистр доступен для чтения и записи, содержит
статусные биты,
Offset |
Type |
Register |
000-007h |
RO | General Capabilities and ID Register |
008-00Fh |
- | Reserved |
010-017h |
R/W | General Configuration Register |
018-01Fh |
- | Reserved |
020-027h |
R/WC | General Interrupt Status Register |
028-0EFh |
- | Reserved |
0F0h-0F7h |
R/W | Main Counter Value Register |
0F8-0FFh |
- | Reserved |
100-107h |
R/W | Timer 0 Configuration and Capability Register |
108-10Fh |
R/W | Timer 0 Comparator Value Register |
110-117h |
R/W | Timer 0 FSB Interrupt Route Register |
118-11Fh |
- | Reserved |
120-127h |
R/W | Timer 1 Configuration and Capability Register |
128-12Fh |
R/W | Timer 1 Comparator Value Register |
130-137h |
R/W | Timer 1 FSB Interrupt Route Register |
138-13Fh |
- | Reserved |
140-147h |
R/W | Timer 2 Configuration and Capability Register |
148-14Fh |
R/W | Timer 2 Comparator Value Register |
150-157h |
R/W | Timer 2 FSB Interrupt Route Register |
158-15Fh |
- | Reserved |
160-3FFh |
- |
Reserved for timers [3-23] |
Побитное описание всех регистров и детальная информация, приводится в [1].
См. также документацию по чипсетам, например [8]. Для краткой справки можно
использовать документ HPET.TXT, находящийся в прилагаемом каталоге WORK.
Примечание 1.
Приведенная таблица содержит полный список регистров, предусмотренных
первоисточником [1] - спецификацией HPET. Так как конкретные реализации HPET
могут не поддерживать часть опциональных функций, таблицы, приводимые в
описаниях "южных мостов" чипсетов, как правило, менее подробны. Это касается
документа [8].
Примечание 2.
Автором обнаружена некорректность в спецификации HPET ревизии 1.0a. Размер
блока MMIO рекомендован равным 1KB, количество компараторов, согласно
спецификации может достигать 32. В блоке HPET MMIO первые 256 байт отводятся под
регистры Header (заголовок, общий для всех компараторов). Для регистров самих
компараторов остается 768 байт. Размер блока регистров каждого компаратора – 32
байта. Таким образом, можно разместить 768/32=24 компаратора, а не 32. Так как в
большинстве существующих реализаций количество компараторов равно трем, проблемы
пока не возникает, а в дальнейшем, разработчики видимо увеличат размер блока
MMIO.
Важно отметить, что архитектура HPET, предусматривает наличие единых
механизмов декларирования количества таймеров, количества каналов в каждом
таймере, разрядности и тактовой частоты счетчика, всех возможностей,
поддерживаемых опционально, а также параметров, зависящих от платформы или
чипсета. Для этого предусмотрены соответствующие поля в регистрах (Read Only).
Поэтому, программное обеспечение может получить эту информацию и настроиться на
текущую конфигурацию, даже в том случае, если чипсет и платформа не распознаны.
Такой принцип сегодня используется при проектировании многих устройств.
Описание работы программы
Как и в ранее опубликованных статьях данного цикла, для работы с предлагаемым
примером, в целях монопольного и беспрепятственного взаимодействия программы с
аппаратным обеспечением автор применил "древнюю" технологию отладки под DOS.
Аргументация такого шага и рекомендации по организации рабочего места приведены
в ранее опубликованной статье "64-битный
режим под DOS: исследовательская работа № 1". Вместе с тем, полученные
знания и навыки универсальны, поэтому могут быть использованы при написании
драйвера HPET для любой ОС.
Для примера была выбрана задача измерения тактовой частоты процессора. Как
известно, процессоры (начиная с Intel Pentium и AMD K5), имеют регистр TSC (Time
Stamp Counter), инкрементируемый по каждому такту внутренней частоты.
Подробности в [4], [5], [6], [10], [11]. Физически, измерение состоит в
определении приращения значения TSC за образцовый интервал времени. Для
формирования такого интервала используется таймер. В предлагаемом примере
выполняется два измерения: с использованием "старого" таймера и таймера HPET.
Результаты выводятся на экран. Измерение двумя методами дает возможность для
самопроверки. Программа вначале пытается детектировать HPET "легальным" методом,
используя интерфейс ACPI. Если это не удается (не поддерживается ACPI или
отсутствует таблица с сигнатурой "HPET"), программа пытается распознать чипсет и
включить HPET путем прямого программирования конфигурационных регистров.
Разумеется, данный метод, в отличие от использования ACPI, требует наличия своих
процедур поддержки для каждого чипсета. В данной реализации программы,
поддерживается только микросхема Intel ICH6 (это "южный мост" чипсетов Intel 915
и 925). Заинтересованный читатель может добавить в пример поддержку других
чипсетов. Еще раз отметим, что такая поддержка требуется только для платформ, на
которых BIOS не поддерживает HPET (не включает и не декларирует посредством
ACPI). Иначе, детектирование HPET программой выполняется посредством ACPI и не
зависит от чипсета.
Данная версия программы использует 32-битную адресацию и рассчитана на то,
что таблицы ACPI и регион HPET MMIO находятся в пределах нижних 4GB адресного
пространства. Чтобы не "загромождать" пример, автор не включил в него поддержку
64-битного режима или PAE (Physical Address Extension). Заинтересованный
читатель может выполнить такую доработку, используя ранее опубликованные статьи
данного цикла.
Если платформа поддерживает несколько ACPI таблиц "HPET" (декларировано
несколько таймеров), будет использован первый таймер, в порядке детектирования.
Прилагаемый каталог WORK содержит следующие файлы:
ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы
под отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл.
ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется
EXE файл.
TIMERS.ASM – основной модуль программы.
OUTPUT.INC – процедура вывода строки на экран с использованием сервиса
DOS, а также процедуры вывода десятичных чисел.
A20.INC – библиотека для управления адресной линией A20. Использует
управление сигналом Gate A20 через выходной порт контроллера клавиатуры 8042.
Подробности в [19], [22].
BIGREAL.INC – библиотека для поддержки Big Real Mode и 32-битной
адресации в реальном режиме. Для включения Big Real Mode, процессор временно
переводится в Protected Mode, в сегментные регистры загружаются селекторы
сегментов, в дескрипторах которых поле Limit=FFFFFFFFh (4GB). После возврата в
Real Mode, процессор "помнит" измененные значения лимитов, что позволяет
формировать 32-битные адреса в Real Mode. Для восстановления состояния, таким же
образом, временно переводим процессор в Protected Mode и устанавливаем лимиты
0000FFFFh (64KB). Управление линией A20 и 32-битная адресация необходимы в
данной программе, так как регион HPET MMIO и таблицы ACPI находятся выше 1MB.
CPUID.INC – процедура проверки наличия поддержки процессором
инструкции CPUID.
ACPI.INC – библиотека для детектирования поддержки ACPI и поиска
таблиц по заданной сигнатуре.
CHIPSET.INC – библиотека для управления конфигурационными регистрами
чипсета с целью разрешения доступа к таймеру HPET. Содержит процедуры
детектирования чипсета, разрешения доступа к HPET и восстановления исходного
состояния чипсета после разрешения доступа к HPET.
CLK_IRQ0.INC – процедура измерения тактовой частоты процессора,
использующая "старый" таймер, основана на определении приращения содержимого
регистра TSC за время между двумя прерываниями IRQ0.
CLK_HPET.INC – процедура измерения тактовой частоты процессора,
использующая таймер HPET, основана на определении приращения содержимого
регистра TSC за время нахождения одного из разрядов счетчика в состоянии "1". В
связи с тем, что тактовая частота HPET может быть различной на различных
платформах, номер опрашиваемого разряда выбирается динамически. Выбираем разряд,
период переключений которого ближе всего к 0.01 секунды. Это компромисс:
использование разрядов с малым периодом может увеличить погрешность, слишком
большой период нежелательно использовать, чтобы не нарушить обработку прерываний
в системе, так как на время измерения они запрещаются.
DELAY.INC – процедура задержки с использованием прерываний IRQ0 от
"старого" таймера. Применяется в данной программе для синхронизации и отработки
паузы перед измерением тактовой частоты процессора. Это уменьшает влияние
факторов, снижающих точность измерения.
DATASEGS.INC – сегменты данных: сегмент для хранения переменных,
сегмент с текстовыми строками, сегмент стека.
HPET.TXT – текстовый файл, краткая справка по регистрам региона HPET
MMIO и назначению битов в регистрах.
Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания
соответствует нумерации пунктов комментариев в исходном тексте - файле
WORK\timers.asm.
1) Контрольная точка 00h – начало выполнения программы. Вывод в порт 80h кода
00h.
2) Установка SS:SP для адресации стека.
3) Проверяем, что процессор в реальном режиме (MSW.0=0), иначе уходим на
генерацию сообщения об ошибке и завершение программы.
4) Проверяем, что процессор поддерживает регистр TSC (Time Stamp Counter),
иначе уходим на генерацию сообщения об ошибке и завершение программы.
5) Измеряем тактовую частоту процессора, используя "старый" таймер.
6) Выводим результат измерения на экран.
7) Обнуляем флаг, индицирующий необходимость восстановления состояния
чипсета.
8) Обеспечиваем 32-битную адресацию в диапазоне 0-4GB. Это потребуется для
доступа к HPET MMIO и таблицам ACPI. Действие состоит в разрешении адресной
линии A20 (если она запрещена исходно) и включении режима Big Real Mode (для
сегментов DS, ES). После данного шага, программа может формировать адреса
00000000h-FFFFFFFFh в реальном режиме.
9) Детектируем поддержку ACPI, для этого сканируем область адресов
000E0000h-000FFFFFh (128KB, блок BIOS Runtime), ищем структуру RSDP (Root System
Description Pointer) по сигнатуре "RSD PTR ". Если сигнатура найдена и
контрольная сумма структуры корректна, ACPI поддерживается платформой. В этом
случае из структуры RSDP считываем 32-битный физический адрес таблицы RSDT (Root
System Description Table), которая является списком таблиц ACPI. Подробности в
[18].
10) Детектируем поддержку HPET, для этого последовательно проверяем все ACPI
таблицы, адреса которых перечислены в RSDT и ищем таблицу с сигнатурой "HPET".
Так как встречаются реализации ACPI, у которых не все таблицы перечислены в
RSDT, в случае, если искомую таблицу не удалось найти по RSDT, используем прямой
поиск таблицы в памяти. В случае обнаружения таблицы и корректной контрольной
суммы, считываем из таблицы базовый адрес регистров таймера (HPET MMIO) и
переходим к шагу 13. Подробности в [1], [18].
11) Данный шаг выполняется только в том случае, если таймер HPET не
детектирован посредством интерфейса ACPI. Детектируем чипсет для активации
процедуры "принудительного" включения HPET путем перенастройки конфигурационных
регистров "южного моста". В данной версии программы эта операция поддерживается
только для Intel ICH6. Подробности в [8].
12) Данный шаг выполняется только в том случае, если таймер HPET не
детектирован посредством интерфейса ACPI. Перенастраиваем конфигурационные
регистры "южного моста" для принудительного включения HPET. Определяем базовый
адрес HPET MMIO в соответствии с особенностями реализации конкретного чипсета и
платформы. Подробности в [8].
13) Базовый адрес HPET MMIO определен посредством ACPI или прямого
взаимодействия с чипсетом. Измеряем тактовую частоту процессора, используя HPET.
Подробности в [1].
14) Выводим результат измерения на экран.
15) Если чипсет перепрограммировался для "принудительного" включения HPET,
восстанавливаем исходное состояние регистров чипсета. Подробности в [8].
16) Восстанавливаем системный контекст: Big Real Mode запрещается (лимиты
сегментов устанавливаются равными 64KB), линия A20 переводится в исходное
состояние (имевшее место на момент запуска программы).
17) Exit Point 1 – точка выхода, используемая при отсутствии ошибок. Выдаем
на экран сообщение об успешном завершении программы и выходим в DOS с кодом
завершения 00h.
18) Exit Point 2 – точка выхода, используемая при возникновении ошибок в
интервале времени, когда чипсет перенастроен. Выполняет восстановление состояния
чипсета, восстановление системного контекста (A20, Big Real Mode), вывод
сообщения об ошибке и выход в DOS.
19) Exit Point 3 – точка выхода, используемая при возникновении ошибок в
интервале времени, когда чипсет не перенастроен, но системный контекст изменен.
Выполняет восстановление системного контекста (A20, Big Real Mode), вывод
сообщения об ошибке и выход в DOS.
20) Exit Point 4 – точка выхода, используемая при возникновении ошибок в
интервале времени, когда чипсет не перенастроен и системный контекст не изменен.
Выводит сообщения об ошибке и выход в DOS.
Источники информации
Электронные документы, доступные на сайте
developer.intel.com.
1) IA-PC HPET (High Precision Event Timers) Specification. Revision 1.0a.
2) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic
Architecture. Order Number 253665-023US.
3) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A:
Instruction Set Reference, A-M. Order Number 253666-023US.
4) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B:
Instruction Set Reference, N-Z. Order Number 253667-023US.
5) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3A:
System Programming Guide, Part 1. Order Number 253668-023US.
6) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3B:
System Programming Guide, Part 2. Order Number 253669-023US.
7) Intel 915G/915P Express Chipset Datasheet. Document Number 301467-001.
8) Intel I/O Controller Hub 6 (ICH6) Family Datasheet. Document Number
301473-001.
Электронные документы, доступные на сайте
developer.amd.com.
9) AMD64 Architecture Programmer’s Manual. Volume 1: Application Programming.
Publication No. 24592.
10) AMD64 Architecture Programmer’s Manual. Volume 2: System Programming.
Publication No. 24593.
11) AMD64 Architecture Programmer’s Manual. Volume 3: General-Purpose and System
Instructions. Publication No. 24594.
12) AMD64 Architecture Programmer’s Manual. Volume 4: 128-Bit Media
Instructions. Publication No. 26568.
13) AMD64 Architecture Programmer’s Manual. Volume 5: 64-Bit Media and x87
Floating-Point Instructions. Publication No. 26569.
14) BIOS and Kernel Developer’s Guide for AMD Athlon 64 and AMD Opteron
Processors. Publication No. 26094.
15) BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors.
Publication No. 32559.
16) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors.
Publication No. 31116.
Электронные документы, доступные на сайте
pcisig.com.
17) PCI BIOS Specification. Revision 2.1.
Электронные документы, доступные на сайте
acpi.info.
18) Advanced Configuration and Power Interface Specification. Hewlett-Packard
Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies
Ltd., Toshiba Corporation. Revision 3.0.
Книги
19) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО "ГРАНАЛ" 1993.
20) В.Г. Артюхов, А.А. Будняк. В.Ю. Лапий. С.М. Молявко, А.И. Петренко.
Проектирование микропроцессорной электронно-вычислительной аппаратуры.
Справочник. Киев "Тэхника" 1988.
21) К. Г. Самофалов, О.В. Викторов. Микропроцессоры. Библиотека инженера. Киев
"Тэхника" 1989.
22) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В.
Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM
PC/XT/AT и PS/2. Москва "Радио и связь" 1995.
23) Ю.М. Казаринов, В.Н. Номоконов, Г.С. Подклетнов, Ф.В. Филиппов.
Микропроцессорный комплект К1810. Структура, программирование, применение.
Справочная книга. Москва "Высшая школа" 1990.