stringtranslate.com

Высокоточный таймер событий

Высокоточный таймер событий ( HPET ) — это аппаратный таймер, доступный в современных x86-совместимых персональных компьютерах . По сравнению со старыми типами таймеров, доступными в архитектуре x86, HPET обеспечивает более эффективную обработку высокочувствительных ко времени приложений, таких как воспроизведение мультимедиа и переключение задач ОС . Он был разработан совместно Intel и Microsoft и был включен в наборы микросхем ПК с 2005 года. Ранее Intel называл его Мультимедийным таймером , [1] термин HPET был выбран, чтобы избежать путаницы с программными мультимедийными таймерами, представленными в расширениях MultiMedia для Windows 3.0 . [2]

Старые операционные системы , не поддерживающие аппаратное устройство 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 в современных ПК интегрирована в микросхему южного моста . [a]

Каждый компаратор может генерировать прерывание , когда младшие биты равны соответствующим битам 64-битного значения основного счетчика. Компараторы могут быть переведены в режим одноразового или периодического действия, при этом по крайней мере один компаратор поддерживает периодический режим, и все они поддерживают режим одноразового действия. В режиме одноразового действия компаратор запускает прерывание один раз, когда основной счетчик достигает значения, сохраненного в регистре компаратора, тогда как в периодическом режиме прерывания генерируются с заданными интервалами.

Компараторы могут управляться операционной системой, например, для предоставления одного таймера на каждый ЦП для планирования, или приложениями.

Приложения

HPET может производить периодические прерывания с гораздо более высоким разрешением, чем RTC, и часто используется для синхронизации потоков мультимедиа, обеспечивая плавное воспроизведение и уменьшая необходимость использования других вычислений временных меток, таких как инструкции процессора на базе x86RDTSC . Это обеспечивает повышенную эффективность, поскольку процессору не нужно тратить циклы, чтобы компенсировать низкое разрешение таймеров, и позволяет более агрессивно использовать состояния сна , снижая энергопотребление. В дополнение к требованию уровня приложений для высокоточных часов, есть преимущества на уровне ОС в планировщике и за счет наличия стабильной базы часов для многопроцессорных систем. [3]

Сравнение с предшественниками

HPET предназначен для дополнения и замены программируемого интервального таймера 8254 и функции периодического прерывания RTC. По сравнению с этими старыми схемами таймера, HPET имеет более высокую частоту и более широкие 64-битные счетчики (хотя они могут управляться в 32-битном режиме). [1]

Спецификация HPET не определяет частоту таймера, требуя только минимальное значение 10 МГц; фактическая частота предоставляется операционной системе аппаратным регистром, определяющим количество фемтосекунд за период (с верхней границей100 000 000  фс ). Популярное значение — 14,3 18  МГц, что в 12 раз больше стандартной частоты 8254 — 1,193 18  МГц.

Хотя 8254 и RTC можно перевести в режим одноразового действия, подобный HPET, процесс настройки настолько медленный, что их режим одноразового действия не используется на практике для задач, требующих точного планирования. [4] Вместо этого 8254 и RTC обычно используются в периодическом режиме с очень малым временным интервалом. Например, если приложению необходимо выполнить несколько коротких (возможно, несколько миллисекунд) ожиданий, лучше иметь периодический таймер, работающий постоянно с периодом 1 мс из-за высокой стоимости настройки таймера одноразового действия 8254 или RTC. Это вызывает прерывание каждую миллисекунду, даже если приложению нужно выполнять фактическую работу реже. С HPET можно избежать дополнительных прерываний, поскольку стоимость настройки таймера одноразового действия HPET значительно меньше.

Использование и совместимость

Журнал загрузки Linux, показывающий переключение с HPET на TSC в качестве источника системных часов

Операционные системы, разработанные до появления HPET, не могут использовать HPET, поэтому они используют другие возможности таймера. Более новые операционные системы, как правило, могут использовать любой из них. Некоторое оборудование имеет оба. Действительно, большинство современных чипов южного моста имеют поддерживающие устаревшие экземпляры PIT, PIC, Advanced Programmable Interrupt Controller (APIC) и RTC-устройств, встроенные в их кремний, независимо от того, используются ли они операционной системой, что помогает очень современным ПК запускать старые операционные системы.

Известно, что следующие операционные системы не могут использовать HPET: Windows XP SP1, [b] и более ранние версии Windows , ядра Linux до версии 2.6. [c]

Известно, что следующие операционные системы могут использовать HPET: Windows XP SP3, [d] Windows Server 2003 SP2 , Windows Server 2008 , Windows Server 2008 R2 , Windows Vista , Windows 7 , версии OS X на базе x86 , операционные системы Linux , использующие ядро ​​2.6 (или более поздние версии), FreeBSD [5] и OpenSolaris . [ требуется ссылка ]

Ядро Linux также может использовать HPET в качестве источника синхронизации. В документации Red Hat MRG версии 2 указано, что TSC является предпочтительным источником синхронизации из-за его гораздо меньших накладных расходов, но он использует HPET в качестве резервного варианта. Тест в этой среде для 10 миллионов событий показал, что TSC занял около 0,6 секунд, HPET занял чуть более 12 секунд, а ACPI Power Management Timer занял около 24 секунд. [6]

В 2019 году было принято решение внести HPET в черный список в новых ядрах Linux при работе на некоторых процессорах Intel ( Coffee Lake ) из-за его нестабильности. [7]

Проблемы

HPET — это непрерывно работающий таймер, который считает вверх, а не одноразовое устройство, которое считает вниз до нуля, вызывает одно прерывание и затем останавливается. Поскольку HPET сравнивает фактическое значение таймера и запрограммированное целевое значение на равенство, а не «больше или равно», прерывания могут быть пропущены, если целевое время уже прошло, когда значение компаратора записывается в регистр чипа. [8] В таком случае не только пропускается предполагаемое прерывание, но и фактически устанавливается далеко в будущем (примерно на 2 32 или 2 64 отсчета). [9] При наличии немаскируемых прерываний (таких как прерывание управления системой (SMI)), которые не имеют жесткой верхней границы времени выполнения, это состояние гонки требует длительных повторных проверок таймера после настройки и его трудно полностью избежать. Трудности усугубляются, если значение компаратора не синхронизируется с таймером немедленно, а задерживается на один или два тика, как это делают некоторые чипсеты. [8]

Помимо упоминания состояния гонки, обсуждавшегося выше, в документе VMware также перечислены некоторые другие недостатки: «Спецификация не требует, чтобы таймер был особенно мелкозернистым, имел малый дрейф или был быстрым для считывания. Некоторые типичные реализации запускают счетчик на частоте около 18 МГц и требуют примерно столько же времени (1–2 мкс) для считывания HPET, как и в случае с таймером ACPI. Были замечены реализации, в которых регистр периода сбивается на 800 частей на миллион или более». [9]

Примечания

  1. ^ На этих высокоинтегрированных кристаллах BIOS часто неправильно настраивает HPET в ACPI, инициализируя его правильно только в режиме Intel 8253. Если ACPI настроен неправильно, ОС не может перечислить HPET. А разработчики BIOS и ОС не видят необходимости в поддержке Real Time. Поэтому HPET существует только для удовлетворения потребностей системы в высокой скорости. Если HPET настроен правильно в ACPI из BIOS, то страница ACPI MMIO первой микросхемы HPET должна быть на 0xFED00000, а вторая HPET на странице 0xFED80000 (см. обсуждение для получения дополнительной информации).
  2. ^ Windows XP , SP2 знает таймер HPET (как устройство с идентификатором ACPI\PNP0103). При его обнаружении (например, на материнской плате Intel DQ45CB) диспетчер устройств (Пуск / Настройки / Панель управления / Система / Диспетчер устройств) показывает устройство "High Precision Event Timer" в ветке "Системные устройства". Но это устройство вообще не используется.
  3. ^ При использовании ядра Linux вам понадобится более новый драйвер аппаратного устройства часов RTC-CMOS, а не оригинальный драйвер RTC.
  4. ^ XP SP3 «эмулирует» большую часть спецификации HPET, разработанной в 2002 году в ожидании устройства, которое в конечном итоге появится в ПК, разработанных для Windows Vista к 2005 году. Термин «High Precision Event Timer» затем используется в диспетчере драйверов для описания подсистем синхронизации TSC (Time-Stamp-Counter) или ACPI Power Management Timer (PMTimer), даже когда устройство Intel HPET 15 МГц не используется. Хотя верно то, что только Windows Vista и более поздние версии Windows используют физический Intel HPET 15 МГц, функции операционной системы, предназначенные для выполнения HPET, уже в значительной степени существовали в Windows XP, хотя и в другой спецификации (2002, а не 2005 года) и, следовательно, с ограниченными возможностями. С точки зрения физического воплощения в Windows XP SP3, IRQ0 и IRQ8 обычно сопоставляются с "High Precision Event Timer" при использовании ACPI HAL (версия 5.1.2600.5512), хотя вызов API QueryPerformanceFrequency возвращает значение, связанное с номинальной тактовой частотой процессора (например, 2,6 ГГц) или PMTIMER (3,579545 МГц), а не со значением Intel HPET 15 МГц, которое вы получили бы при использовании Windows Vista. Эта аномалия мутит воду о том, что подразумевается под "HPET" в таких системах, но это явно не устройство Intel с тактовой частотой 15 МГц в этих случаях. Обратите внимание, что это сопоставление IRQ с цитированием "HPET" и не-HPET тактовой частотой можно найти как в системах Intel, так и в системах AMD, независимо от того, используют ли они загрузочную переопределение /USEPMTIMER. Поскольку первоначальная спецификация для HPET (в 2002 году) требует счетчика высокого разрешения, который затем раскрывается вызовами API QueryPerformanceFrequency и QueryPerformanceCounter (уже доступными с Windows 2000), именно QueryPerformanceFrequency может пролить свет на то, как на самом деле предоставляется этот счетчик «высокой точности». Высокое значение (в диапазоне от 1 ГГц до 4 ГГц) подразумевает, что источником является счетчик временных меток (TSC) ЦП. Ранние многоядерные ЦП от AMD выявили проблему с показаниями QueryPerformanceCounter, полученными из TSC, поскольку на них влияли вариации скорости управления расширенным спектром и питанием. Хотя в конечном итоге это было решено в более поздних конструкциях процессоров путем создания независимых от тактовой частоты ЦП часов TSC, таймер PM в системах ACPI стал источником счетчика по выбору, требуя переопределения /USEPMTIMER в файле Windows BOOT.INI для принудительного его использования. На машинах Intel и AMD, использующих ACPI HAL вместе с загрузочным переключателем /USEPMTIMER, IRQ 0 и 8 по-прежнему будут сообщать HPET, но теперь QueryPerformanceFrequency будет сообщать 3,579545 МГц, что является частотой PMTIMER. Это имеет явное преимущество в том, что не зависит от частоты ЦП и по-прежнему обеспечивает очень разумное субмикросекундное разрешение и точность.По иронии судьбы очень высокие скорости счета, полученные в механизмах TSC (по сравнению с PMTIMER или устройством Intel HPET), могут вызвать проблему, заключающуюся в том, что измеряемые временные интервалы слишком коротки: существует верхний предел полезности счетчика, который переполняется рано. Также может быть неприятно, что постоянно увеличивающиеся скорости процессоров новых конструкций делают этот полезный временной интервал еще короче. Поэтому неудивительно, что системы PMTIMER и Intel HPET используют четко указанную фиксированную скорость, которая намеренно нацелена на получение разрешений в субмикросекундном диапазоне, что позволяет им измерять в течение более длительных периодов, чем это возможно с TSC. С переключателем /PMTIMER или без него часть "событие" спецификации HPET может быть эмулирована только с использованием еще одного источника синхронизации, поскольку ни базовое решение TSC, ни PMTIMER не включают неявное оборудование для апериодического запуска событий, как описано в спецификации, и тем не менее это доступно через API таймера в Windows XP (с наилучшим возможным разрешением 0,9766 мс, когда используются вызовы API timeBeginPeriod - timeEndPeriod). Эта часть спецификации по-прежнему выполняется устройством RTC с помощью программного обеспечения, несмотря на то, что диспетчер устройств цитирует HPET в позициях IRQ0 и IRQ8.

Ссылки

  1. ^ ab Intel Corporation (октябрь 2004 г.), Спецификация IA-PC HPET (High Precision Event Timers) (редакция 1.0a) (PDF) , получено 15 июня 2012 г.
  2. ^ "Мультимедийные таймеры". Microsoft . Получено 2010-10-20 .
  3. ^ "Спецификация IA-PC HPET (High Precision Event Timers)" (PDF) . Intel. Октябрь 2004 г. Получено 30 августа 2022 г. .
  4. ^ Руководство по предоставлению поддержки таймера мультимедиа, 2002-09-20 , получено 10 ноября 2009 г.
  5. ^ "Страницы руководства FreeBSD: hpet(4)". www.freebsd.org .
  6. ^ "Глава 15. Отметка времени". Access.redhat.com. Архивировано из оригинала 2016-05-07 . Получено 2014-02-14 .
  7. ^ "Ядро Linux отключает HPET для Intel Coffee Lake". Phoronix .
  8. ^ ab Thomas Gleixner, x86: hpet: Обход аппаратной тупости Архивировано 2012-07-09 на archive.today , коммит объединен для ядра Linux 2.6.36-rc5
  9. ^ ab Хронометраж в виртуальных машинах VMware (для VMware vSphere 5.0, Workstation 8.0, Fusion 4.0), стр. 9