Введение
Аппаратный таймер, используемый в персональных компьютерах
Высокоточный таймер событий (HPET) – это аппаратный таймер, доступный в современных персональных компьютерах, совместимых с x86. По сравнению с более старыми типами таймеров, доступными в архитектуре x86, HPET обеспечивает более эффективную обработку приложений, критичных ко времени, таких как воспроизведение мультимедиа и переключение задач операционной системы. Он был разработан совместно компаниями Intel и Microsoft и включен в чипсеты для ПК начиная с 2005 года. Ранее Intel называл его мультимедийным таймером.
Более старые операционные системы, не поддерживающие аппаратный HPET, могут использовать только устаревшие средства синхронизации времени, такие как программируемый интервальный таймер (PIT) или часы реального времени (RTC). Windows XP, при использовании новейшего слоя аппаратной абстракции (HAL), также может использовать счетчик временных меток процессора (TSC) или таймер управления питанием ACPI (ACPI PMTIMER) вместе с RTC для обеспечения функций операционной системы, которые в более поздних версиях Windows предоставляются аппаратным HPET. Примечательно, что такие системы Windows XP отображают информацию о подключении "HPET" в диспетчере устройств, даже если само устройство Intel HPET не используется.
Особенности
Чип HPET состоит из 64-битного счетчика (основного счетчика), увеличивающегося с частотой не менее 10 МГц, и набора (не менее трех, до 256) компараторов. Эти компараторы имеют разрядность 32 или 64 бита. HPET программируется через окно ввода-вывода, отображенное в память, которое обнаруживается с помощью ACPI. В современных ПК схема HPET интегрирована в чип южного моста. Каждый компаратор может генерировать прерывание, когда младшие значащие биты равны соответствующим битам значения 64-битного основного счетчика. Компараторы могут работать в однократном или периодическом режиме, при этом как минимум один компаратор поддерживает периодический режим, а все – однократный. В однократном режиме компаратор генерирует прерывание один раз, когда основной счетчик достигает значения, хранящегося в регистре компаратора, а в периодическом режиме прерывания генерируются через заданные интервалы. Управлять компараторами может операционная система, например, для обеспечения одного таймера на процессор для планирования, или приложения.
Приложения
HPET способен генерировать периодические прерывания с гораздо более высоким разрешением, чем RTC, и часто используется для синхронизации мультимедийных потоков, обеспечивая плавное воспроизведение и снижая необходимость в использовании других вычислений временных меток, таких как инструкция RDTSC центрального процессора x86. Это повышает эффективность, поскольку процессору не требуется тратить такты на компенсацию низкого разрешения таймеров, и позволяет более активно использовать состояния энергосбережения, уменьшая энергопотребление. Помимо потребностей приложений в высокоточном таймере, существуют преимущества на уровне операционной системы в планировщике и благодаря наличию стабильной базовой частоты для многопроцессорных систем.
Сравнение с предшественниками
HPET предназначен для дополнения и замены программируемого интервального таймера 8254 и функции периодического прерывания RTC. По сравнению с этими более старыми таймерными схемами, HPET обладает более высокой частотой и 64-битными счетчиками большего размера (хотя они могут работать и в 32-битном режиме). Спецификация HPET не определяет частоту таймера, а лишь требует минимального значения в 10 МГц; фактическая частота передается операционной системе через аппаратный регистр, указывающий количество фемтосекунд на период (с верхним пределом 100 000 000). Распространенное значение – 14,3 МГц, что в 12 раз превышает стандартную частоту 8254, равную 1,193 МГц. Хотя 8254 и RTC могут быть переведены в однократный режим, подобный HPET, процесс настройки настолько медленный, что их однократный режим на практике не используется для задач, требующих точного планирования. Вместо этого 8254 и RTC обычно используются в периодическом режиме с очень малым интервалом времени. Например, если приложению необходимо выполнить несколько коротких (возможно, в несколько миллисекунд) задержек, лучше использовать постоянно работающий периодический таймер с периодом 1 мс из-за высокой стоимости настройки однократного таймера 8254 или RTC. Это приводит к прерыванию каждую миллисекунду, даже если приложению не требуется выполнять реальную работу так часто. С HPET можно избежать лишних прерываний, поскольку стоимость настройки однократного таймера HPET значительно ниже.
Проблемы
HPET — это непрерывно работающий таймер, который считает вверх, а не одноразовое устройство, отсчитывающее время до нуля, вызывающее одно прерывание и затем останавливающееся. Поскольку HPET сравнивает фактическое значение таймера и запрограммированное целевое значение на совпадение, а не "больше или равно", прерывания могут быть пропущены, если целевое время уже прошло к моменту записи значения компаратора в регистр чипа. Помимо упомянутой выше гонки данных, в документе VMware также перечислены другие недостатки: "В спецификации не предъявляются особые требования к высокой точности таймера, малому дрейфу или скорости чтения. В некоторых типичных реализациях счетчик работает на частоте около 18 МГц, а время, необходимое для чтения HPET, составляет примерно столько же (1–2 мкс), как и для ACPI-таймера. Встречались реализации, в которых регистр периода отклонялся на 800 частей на миллион и более."