El temporizador de eventos de alta precisión ( HPET ) es un temporizador de hardware que se utiliza en las computadoras personales . Fue desarrollado conjuntamente por Intel y Microsoft y se ha incorporado en los conjuntos de chips de PC desde 2005. Anteriormente conocido por Intel como Temporizador multimedia , [1] el término HPET se seleccionó para evitar confusiones con los temporizadores multimedia de software introducidos en las Extensiones MultiMedia para Windows 3.0 . [2]
Los sistemas operativos más antiguos que no son compatibles con un dispositivo HPET de hardware solo pueden utilizar funciones de temporización más antiguas, como el temporizador de intervalo programable (PIT) o el reloj en tiempo real (RTC). Windows XP , cuando está equipado con la última capa de abstracción de hardware (HAL), también puede usar el contador de marca de tiempo (TSC) del procesador o el temporizador de administración de energía ACPI (ACPI PMTIMER), junto con el RTC para proporcionar características del sistema operativo que, en versiones posteriores de Windows, serán proporcionadas por el hardware de HPET. De manera confusa, tales sistemas Windows XP citan conectividad "HPET" en el administrador de controladores de dispositivo aunque no se esté utilizando el dispositivo Intel HPET.
Características
Un chip HPET consta de un contador ascendente de 64 bits ( contador principal) que cuenta a una frecuencia de al menos 10 MHz y un conjunto de (al menos tres, hasta 256) comparadores. Estos comparadores tienen un ancho de 32 o 64 bits. El HPET se programa a través de una ventana de E / S asignada a la memoria que se puede descubrir a través de la Configuración avanzada y la interfaz de energía (ACPI). El circuito HPET en las PC modernas está integrado en el chip Southbridge . [a]
Cada comparador puede generar una interrupción cuando los bits menos significativos son iguales a los bits correspondientes del valor del contador principal de 64 bits. Los comparadores se pueden poner en modo de una sola operación o en modo periódico, con al menos un comparador que admita el modo periódico y todos ellos admitan el modo de una sola operación. En el modo de disparo único, el comparador dispara una interrupción una vez cuando el contador principal alcanza el valor almacenado en el registro del comparador, mientras que en el modo periódico las interrupciones se generan a intervalos específicos.
Los comparadores pueden ser controlados por el sistema operativo, por ejemplo, para proporcionar un temporizador por CPU para la programación, o por aplicaciones.
Aplicaciones
El HPET puede producir interrupciones periódicas a una resolución mucho más alta que el RTC y se utiliza a menudo para sincronizar transmisiones multimedia, proporcionando una reproducción fluida y reduciendo la necesidad de utilizar otros cálculos de marcas de tiempo como las instrucciones de una CPU basada en X86RDTSC
.
Comparación con predecesores
HPET está destinado a complementar y reemplazar el temporizador de intervalo programable 8254 y la función de interrupción periódica del RTC. En comparación con estos circuitos de temporizador más antiguos, el HPET tiene una frecuencia más alta y contadores de 64 bits más anchos (aunque pueden funcionar en modo de 32 bits). [1]
La especificación HPET no define la frecuencia del temporizador, solo requiere un mínimo de 10 MHz; la frecuencia real es proporcionada al sistema operativo por un registro de hardware que da el número de femtosegundos por período (con un límite superior de100 000 000 fs ). Un valor popular es 14,3 18 MHz, 12 veces la frecuencia estándar 8254 de 1,193 18 MHz.
Si bien el 8254 y el RTC se pueden poner en un modo de disparo único similar a HPET, el proceso de configuración es tan lento que su modo de disparo único no se usa en la práctica para tareas que requieren una programación precisa. [3] En cambio, 8254 y RTC se utilizan normalmente en modo periódico con un intervalo de tiempo muy pequeño. Por ejemplo, si una aplicación necesita realizar varias esperas cortas (algunos milisegundos, quizás), es mejor tener un temporizador periódico funcionando constantemente con un período de 1 ms debido al alto costo de configuración de un temporizador de un solo disparo 8254 o RTC. Esto provoca una interrupción cada milisegundo, incluso si la aplicación necesita realizar el trabajo real con menos frecuencia. Con HPET, se pueden evitar las interrupciones adicionales, porque el costo de configuración de un temporizador de disparo único de HPET es considerablemente menor.
Uso y compatibilidad
Los sistemas operativos diseñados antes de que existiera HPET no pueden usar HPET, por lo que usan otras funciones de temporizador. Los sistemas operativos más nuevos tienden a poder usar cualquiera de los dos. Algunos hardware tienen ambos. De hecho, la mayoría de los chips Southbridge actuales tienen instancias de soporte heredado de dispositivos PIT, PIC, controlador de interrupción programable avanzado (APIC) y dispositivos RTC incorporados en su silicio, ya sea que los utilice el sistema operativo o no, lo que ayuda a las PC muy modernas a ejecutar sistemas operativos más antiguos. .
Se sabe que los siguientes sistemas operativos no pueden utilizar HPET: Windows XP SP1, [b] y versiones anteriores de Windows , kernels de Linux anteriores a 2.6. [C]
Se sabe que los siguientes sistemas operativos pueden utilizar HPET: Windows XP SP3, [d] Windows Server 2003 SP2 , Windows Server 2008 , Windows Server 2008 R2 , Windows Vista , Windows 7 , versiones basadas en x86 de OS X , sistemas operativos Linux utilizando el kernel 2.6 (o posterior), FreeBSD [4] y OpenSolaris . [ cita requerida ]
El kernel de Linux también puede usar HPET como fuente de reloj . La documentación de Red Hat MRG versión 2 establece que TSC es la fuente de reloj preferida debido a su sobrecarga mucho menor, pero usa HPET como alternativa. Un punto de referencia en ese entorno para 10 millones de recuentos de eventos encontró que TSC tomó alrededor de 0,6 segundos, HPET tomó un poco más de 12 segundos y ACPI Power Management Timer tomó alrededor de 24 segundos. [5]
En 2019, se decidió incluir HPET en la lista negra en los kernels de Linux más nuevos cuando se ejecuta en algunas CPU de Intel ( Coffee Lake ) debido a su inestabilidad. [6]
Problemas
HPET es un temporizador de funcionamiento continuo que cuenta hacia arriba, no un dispositivo de un solo disparo que cuenta hacia abajo hasta cero, causa una interrupción y luego se detiene. Dado que HPET compara el valor real del temporizador y el valor objetivo programado en igualdad en lugar de "mayor o igual", las interrupciones se pueden perder si el tiempo objetivo ya pasó cuando el valor del comparador se escribe en el registro del chip. [7] En tal caso, no solo se pasa por alto la interrupción prevista, sino que en realidad se establece en el futuro (alrededor de 2 32 o 2 64 cuentas). [8] En presencia de interrupciones que no se pueden enmascarar (como una interrupción de la administración del sistema (SMI)) que no tienen un límite superior estricto en su tiempo de ejecución, esta condición de carrera requiere que el temporizador se vuelva a verificar que requiere mucho tiempo después de la configuración. y es difícil de evitar por completo. Las dificultades se agravan si el valor del comparador no se sincroniza con el temporizador inmediatamente, sino que se retrasa uno o dos tics, como lo hacen algunos conjuntos de chips. [7]
Además de mencionar la condición de carrera discutida anteriormente, un documento de VMware también enumera algunos otros inconvenientes: "La especificación no requiere que el temporizador sea particularmente fino, que tenga una deriva baja o que sea rápido de leer. Algunas implementaciones típicas ejecutan el contador en aproximadamente 18 MHz y requieren aproximadamente la misma cantidad de tiempo (1-2 μs) para leer el HPET que con el temporizador ACPI. Se han observado implementaciones en las que el registro de período está desfasado en 800 partes por millón o más ". [8]
Notas
- ^ En estos troqueles altamente integrados, el BIOS a menudo configura el HPET incorrectamente en el ACPI, inicializándolo correctamente solo en elmodo Intel 8253 . Si el ACPI no está configurado correctamente, el sistema operativo no puede incluir el HPET. Y los desarrolladores de BIOS y SO no ven la necesidad de obtener soporte en tiempo real. Por lo tanto, HPET solo está ahí para satisfacer las necesidades de alta velocidad del sistema. Si HPET está configurado correctamente en ACPI desde BIOS, entonces la página ACPI MMIO del primer chip HPET debe estar en 0xFED00000 y el segundo HPET en la página 0xFED80000 (consulte la discusión para obtener más información).
- ^ Windows XP , SP2 conoce el temporizador HPET (como un dispositivo con identificador ACPI \ PNP0103). Cuando se detecta (por ejemplo, en laplaca base Intel DQ45CB), el Administrador de dispositivos (Inicio / Configuración / Panel de control / Sistema / Administrador de dispositivos) muestra el dispositivo "Temporizador de eventos de alta precisión" en la rama "Dispositivos del sistema". Pero este dispositivo no se usa en absoluto.
- ^ Con un kernel de Linux , necesita el controlador de dispositivo de reloj de hardware RTC-CMOS más nuevo en lugar del controlador RTC original.
- ^ XP SP3 "emula" la mayor parte de la especificación HPET tal como se redactó en 2002 en previsión de un dispositivo que hizo su aparición eventual en PC diseñadas para Windows Vista en 2005. El término "Temporizador de eventos de alta precisión" se utiliza luego en el administrador de controladores para describen los subsistemas de temporización TSC (Time-Stamp-Counter) o ACPI Power Management Timer (PMTimer) incluso cuando no se utiliza el dispositivo Intel HPET de 15 MHz. Si bien es cierto que solo Windows Vista y versiones posteriores de Windows usan el HPET físico Intel de 15 MHz, las características del sistema operativo que pretendía ser cumplidas por HPET ya existían en gran medida en Windows XP, aunque con una especificación diferente (la de 2002 en lugar de 2005) y, por tanto, con una capacidad reducida. En términos de realización física en Windows XP SP3, el IRQ0 y el IRQ8 generalmente se asignan a un "Temporizador de eventos de alta precisión" cuando se usa el ACPI HAL (versión 5.1.2600.5512), aunque la llamada a la API QueryPerformanceFrequency devuelve un valor relacionado con el valor nominal. velocidad de reloj del procesador (por ejemplo, 2.6 GHz) o PMTIMER (3.579545 MHz) en lugar del valor especificado por Intel HPET de 15 MHz que obtendría con Windows Vista. Esta anomalía enturbia el agua sobre lo que se entiende por "HPET" en tales sistemas, pero claramente no es el dispositivo Intel de 15 MHz en esos casos. Tenga en cuenta que esta relación de reloj que no es de HPET y la asignación de IRQ de "HPET" se pueden encontrar tanto en los sistemas Intel como en los sistemas AMD, ya sea que utilicen o no la anulación de arranque / USEPMTIMER. Dado que la especificación original de HPET (en 2002) requiere un contador de alta resolución, que luego se expone mediante las llamadas a la API QueryPerformanceFrequency y QueryPerformanceCounter (ya disponibles desde Windows 2000), es la QueryPerformanceFrequency la que puede arrojar luz sobre cómo esta "alta precisión "En realidad, se está proporcionando un contador. Un valor alto (en el rango de 1 GHz a 4 GHz) implica que el contador de marca de tiempo (TSC) de la CPU es la fuente. Las primeras CPU de múltiples núcleos de AMD expusieron un problema con las lecturas de QueryPerformanceCounter derivadas de TSC, ya que se verían afectadas por variaciones de velocidad de administración de energía y de espectro extendido. Si bien esto finalmente se resolvió en diseños de procesadores posteriores al hacer que el reloj TSC fuera independiente del reloj de la CPU, el temporizador PM en los sistemas ACPI se convirtió en la fuente de contador de elección, requiriendo una anulación / USEPMTIMER en el archivo BOOT.INI de Windows para hacer cumplir su uso. En las máquinas Intel y AMD que utilizan ACPI HAL junto con el interruptor de arranque / USEPMTIMER, las IRQ 0 y 8 seguirán informando un HPET, pero ahora QueryPerformanceFrequency informará 3,579545 MHz, que es la frecuencia del PMTIMER. Esto tiene la ventaja expresa de ser independiente de la frecuencia de la CPU y aún proporciona una resolución y precisión de sub-microsegundos muy razonables. Irónicamente, las tasas de recuento muy altas obtenidas en los mecanismos TSC (en comparación con PMTIMER o el dispositivo Intel HPET) pueden causar el problema de que los intervalos de tiempo medibles son demasiado cortos: hay un límite superior para la utilidad de un contador que se desborda temprano. También puede ser una molestia que las velocidades de procesador cada vez mayores de los diseños de procesadores más nuevos reduzcan aún más este período de tiempo utilizable. Por lo tanto, no es sorprendente que los sistemas PMTIMER e Intel HPET utilicen una tasa fija claramente especificada que esté deliberadamente dirigida a producir resoluciones en el rango de sub-microsegundos, lo que les permite medir durante períodos más largos de lo que es posible con TSC. Con o sin el interruptor / PMTIMER, la parte del "evento" de la especificación HPET solo se puede emular utilizando otra fuente de temporización, ya que ni una solución TSC ni PMTIMER subyacente incluyen hardware implícito para la activación de eventos aperiódicos como se describe en la especificación, y sin embargo, esto está disponible a través de la API del temporizador en Windows XP (a una mejor resolución posible de 0,9766 ms cuando se utilizan las llamadas a la API timeBeginPeriod - timeEndPeriod). Esta parte de la especificación todavía la cumple el dispositivo RTC con la ayuda de software, a pesar de que el administrador del dispositivo está citando HPET en las posiciones IRQ0 e IRQ8.
Referencias
- ^ a b Intel Corporation (octubre de 2004), Especificación de IA-PC HPET (temporizadores de eventos de alta precisión) (revisión 1.0a) (PDF) , consultado el 15 de junio de 2012
- ^ "Temporizadores multimedia" . Microsoft . Consultado el 20 de octubre de 2010 .
- ^ Directrices para proporcionar compatibilidad con temporizador multimedia , 2002-09-20 , consultado el 2009-11-10
- ^ "Páginas de manual de FreeBSD: hpet (4)" . www.freebsd.org .
- ^ "Capítulo 15. Sellado de tiempo" . Access.redhat.com . Consultado el 14 de febrero de 2014 .
- ^ "El kernel de Linux que desactiva HPET para Intel Coffee Lake" . Phoronix .
- ^ a b Thomas Gleixner, x86: hpet: Trabajar en torno a la estupidez del hardware Archivado el 9 de julio de 2012 en archive.today , compromiso combinado para el kernel de Linux 2.6.36-rc5
- ^ a b Cronometraje en máquinas virtuales VMware (para VMware vSphere 5.0, Workstation 8.0, Fusion 4.0) , página 9