stringtranslate.com

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

Таймер событий высокой точности ( HET ) — это аппаратный таймер, доступный в современных x86-совместимых персональных компьютерах . По сравнению со старыми типами таймеров, доступными в архитектуре x86, HPET обеспечивает более эффективную обработку приложений, чувствительных к времени, таких как воспроизведение мультимедиа и переключение задач ОС . Он был разработан совместно Intel и Microsoft и был включен в наборы микросхем ПК с 2005 года. Ранее Intel называл его « Мультимедийный таймер» , [1] термин HPET был выбран во избежание путаницы с программными мультимедийными таймерами, представленными в MultiMedia Extensions для 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 в современных ПК интегрирована в микросхему южного моста . [а]

Каждый компаратор может генерировать прерывание , когда младшие биты равны соответствующим битам 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, усовершенствованного программируемого контроллера прерываний (APIC) и устройств RTC, встроенные в их микросхему, независимо от того, используются они операционной системой или нет, что помогает очень современным ПК работать со старыми операционными системами. .

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

Известно, что следующие операционные системы могут использовать 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 — около 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) диспетчер устройств (Пуск/Настройки/Панель управления/Система/Диспетчер устройств) показывает устройство «Таймер событий высокой точности» в ветке «Системные устройства». Но это устройство вообще не используется.
  3. ^ При использовании ядра Linux вам понадобится более новый драйвер устройства аппаратных часов RTC-CMOS, а не исходный драйвер RTC.
  4. ^ XP SP3 «эмулирует» большую часть спецификации HPET, разработанной в 2002 году в ожидании устройства, которое в конечном итоге появится на ПК, предназначенных для Windows Vista к 2005 году. Термин «Таймер событий высокой точности» затем используется в диспетчере драйверов для описания Подсистемы синхронизации TSC (Time-Stamp-Counter) или ACPI Power Management Timer (PMTimer), даже если устройство Intel HPET 15 МГц не используется. Хотя справедливо сказать, что только Windows Vista и более поздние версии Windows используют физический процессор Intel HPET с частотой 15 МГц, функции операционной системы, которые должен был реализовать HPET, уже в значительной степени существовали в Windows XP, хотя и в другой спецификации (то есть спецификации 2002 года, а не спецификации 2002 года). 2005) и, следовательно, с ограниченными возможностями. С точки зрения физического воплощения в Windows XP SP3, IRQ0 и IRQ8 обычно сопоставляются с «Таймером событий высокой точности» при использовании ACPI HAL (версия 5.1.2600.5512), хотя вызов API QueryPerformanceFrequency возвращает значение, связанное с номинальным значением. тактовая частота процессора (например, 2,6 ГГц) или PMTIMER (3,579545 МГц), а не значение 15 МГц, указанное в спецификации Intel HPET, которое можно получить при использовании 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 (высокоточные таймеры событий) (версия 1.0a) (PDF) , получено 15 июня 2012 г.
  2. ^ «Мультимедийные таймеры». Майкрософт . Проверено 20 октября 2010 г.
  3. ^ «Спецификация IA-PC HPET (высокоточные таймеры событий)» (PDF) . Интел. Октябрь 2004 года . Проверено 30 августа 2022 г.
  4. ^ Рекомендации по обеспечению поддержки мультимедийного таймера, 20 сентября 2002 г. , получено 10 ноября 2009 г.
  5. ^ «Страницы руководства FreeBSD: hpet(4)» . www.freebsd.org .
  6. ^ «Глава 15. Временные метки». Доступ.redhat.com. Архивировано из оригинала 7 мая 2016 г. Проверено 14 февраля 2014 г.
  7. ^ «Ядро Linux отключает HPET для Intel Coffee Lake» . Фороникс .
  8. ^ ab Thomas Gleixner, x86: hpet: Обход аппаратной глупости. Архивировано 9 июля 2012 г. в archive.today , коммит объединен для ядра Linux 2.6.36-rc5.
  9. ^ ab Хронометраж на виртуальных машинах VMware (для VMware vSphere 5.0, Workstation 8.0, Fusion 4.0), стр. 9