Articulo de referencia

Temporizador de eventos de alta precisión

El temporizador de eventos de alta precisión ( HPET ) es un temporizador de hardware disponible en las computadoras personales modernas compatibles con x86 . En comparación con ...

El temporizador de eventos de alta precisión ( HPET ) es un temporizador de hardware disponible en las computadoras personales modernas compatibles con x86 . En comparación con los tipos de temporizadores más antiguos disponibles en la arquitectura x86, HPET permite un procesamiento más eficiente de aplicaciones altamente sensibles al tiempo, como la reproducción multimedia y el cambio de tareas del sistema operativo . Fue desarrollado conjuntamente por Intel y Microsoft y se ha incorporado a los chipsets de PC desde 2005. Anteriormente denominado por Intel como temporizador multimedia , [ 1 ] se seleccionó el término HPET para evitar confusiones con los temporizadores multimedia de software introducidos en las extensiones multimedia de Windows 3.0 . [ 2 ]

Los sistemas operativos más antiguos que no admiten un dispositivo HPET de hardware solo pueden usar funciones de temporización antiguas, como el temporizador de intervalo programable (PIT) o el reloj en tiempo real (RTC). Windows XP , cuando se instala la capa de abstracción de hardware (HAL) más reciente, 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 funciones del sistema operativo que, en versiones posteriores de Windows, serían proporcionadas por el hardware HPET. Curiosamente, estos sistemas Windows XP muestran conectividad "HPET" en el administrador de controladores de dispositivos , 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 mediante una ventana de E/S mapeada en memoria que se puede detectar mediante ACPI . El circuito HPET en las PC modernas está integrado en el chip del puente sur . [ a ]

Cada comparador se programa con un valor y puede generar una interrupción cuando el valor del contador principal coincide con el valor programado o, en modo de 32 bits, cada vez que la mitad inferior de 32 bits del valor del contador principal vuelve a cero. Los comparadores pueden configurarse en modo de disparo único o en modo periódico; al menos un comparador admite el modo periódico y todos admiten el modo de disparo único. En el modo de disparo único, el comparador genera una interrupción una sola vez cuando el contador principal alcanza el valor almacenado en su registro, 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 planificación, o por las aplicaciones.

Aplicaciones

El HPET puede generar interrupciones periódicas con una resolución mucho mayor que el RTC y se utiliza frecuentemente para sincronizar flujos multimedia, lo que proporciona una reproducción fluida y reduce la necesidad de utilizar otros cálculos de marcas de tiempo, como las instrucciones de una CPU basada en x86RDTSC . Esto mejora la eficiencia, ya que la CPU no necesita desperdiciar ciclos para compensar la baja resolución de los temporizadores, y permite un uso más intensivo de los estados de suspensión , reduciendo así el consumo de energía. Además de la demanda de reloj de alta precisión a nivel de aplicación, existen beneficios a nivel del sistema operativo en el planificador y gracias a la disponibilidad de una base de reloj estable para sistemas multiprocesador . [ 3 ]

Comparación con predecesores

El HPET está diseñado para 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 temporizadores más antiguos, el HPET tiene mayor frecuencia y contadores de 64 bits más amplios (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 la proporciona al sistema operativo un registro de hardware que indica 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.

Aunque el 8254 y el RTC pueden configurarse en un modo de disparo único similar al de HPET, el proceso de configuración es tan lento que este modo no se utiliza en la práctica para tareas que requieren una programación precisa. [ 4 ] En cambio, el 8254 y el 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 (de unos pocos 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 disparo único 8254 o RTC. Esto provoca una interrupción cada milisegundo, incluso si la aplicación necesita realizar trabajo real con menos frecuencia. Con HPET, se pueden evitar las interrupciones adicionales, ya que el costo de configuración de un temporizador de disparo único HPET es considerablemente menor.

Uso y compatibilidad

Un registro de arranque de Linux que muestra el cambio de HPET a TSC como fuente de reloj del sistema.

Los sistemas operativos diseñados antes de la existencia de HPET no pueden utilizarlo, por lo que emplean otros mecanismos de temporización. Los sistemas operativos más recientes suelen ser compatibles con ambos. Algunos dispositivos de hardware cuentan con ambos. De hecho, la mayoría de los chips actuales para el puente sur incorporan en su silicio instancias compatibles con versiones anteriores de PIT, PIC, el controlador de interrupciones programable avanzado (APIC) y dispositivos RTC, independientemente de si el sistema operativo los utiliza o no, lo que permite que los ordenadores modernos ejecuten sistemas operativos antiguos.

Se sabe que los siguientes sistemas operativos no pueden usar HPET: Windows XP SP1, [ b ] y versiones anteriores de Windows , núcleos de Linux anteriores a 2.6. [ c ]

Se sabe que los siguientes sistemas operativos pueden usar 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 que usan el kernel 2.6 (o posterior), FreeBSD [ 5 ] y OpenSolaris .

El kernel de Linux también puede usar HPET como fuente de reloj. La documentación de Red Hat MRG versión 2 indica que TSC es la fuente de reloj preferida debido a su menor sobrecarga, pero utiliza HPET como alternativa. Una prueba de rendimiento en ese entorno con 10 millones de eventos reveló que TSC tardó aproximadamente 0,6 segundos, HPET tardó algo más de 12 segundos y el temporizador de administración de energía ACPI tardó alrededor de 24 segundos. [ 6 ]

En 2019 se decidió incluir en la lista negra HPET en los nuevos kernels de Linux cuando se ejecutan en algunas CPU de Intel ( Coffee Lake ) debido a su inestabilidad. [ 7 ]

Problemas

HPET es un temporizador de ejecución continua que cuenta hacia arriba, no un dispositivo de un solo disparo que cuenta hacia abajo hasta cero, provoca una interrupción y luego se detiene. Dado que HPET compara el valor real del temporizador con el valor objetivo programado en función de la igualdad en lugar de "mayor o igual", las interrupciones pueden perderse si el tiempo objetivo ya ha transcurrido cuando el valor del comparador se escribe en el registro del chip. [ 8 ] En tal caso, no solo se pierde la interrupción prevista, sino que en realidad se establece muy lejos en el futuro (aproximadamente 2 32 o 2 64 conteos). [ 9 ] En presencia de interrupciones no enmascarables (como una interrupción de 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 comprobaciones repetidas del temporizador que consumen 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 ciclos, como ocurre en algunos conjuntos de chips. [ 8 ]

Además de mencionar la condición de carrera descrita anteriormente, un documento de VMware también enumera otros inconvenientes: "La especificación no exige que el temporizador sea particularmente preciso, que tenga una baja deriva o que sea rápido de leer. Algunas implementaciones típicas hacen funcionar el contador a unos 18  MHz y requieren aproximadamente el mismo 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." [ 9 ]

Notas

  1. En estos chips altamente integrados, la BIOS suele configurar el HPET incorrectamente en el ACPI, inicializándolo correctamente solo en el modo Intel 8253. Si el ACPI no está configurado correctamente, el sistema operativo no puede listar el HPET. Además, los desarrolladores de la BIOS y del sistema operativo no ven la necesidad de obtener soporte en tiempo real. Por lo tanto, el HPET solo está ahí para satisfacer las necesidades de alta velocidad del sistema. Si el HPET está configurado correctamente en el ACPI desde la BIOS, la página ACPI MMIO del primer chip HPET debería estar en 0xFED00000 y la del segundo en 0xFED80000 (consulte la discusión para obtener más información).
  2. Windows XP SP2 reconoce el temporizador HPET (como un dispositivo con identificador ACPI\PNP0103). Cuando se detecta (por ejemplo, en una placa 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". Sin embargo, este dispositivo no se utiliza en absoluto.
  3. Con un kernel de Linux , necesitas el controlador de dispositivo de reloj de hardware RTC-CMOS más reciente en lugar del controlador RTC original.
  4. XP SP3 "emula" la mayor parte de la especificación HPET tal como se redactó en 2002, anticipándose a un dispositivo que finalmente apareció en las PC diseñadas para Windows Vista en 2005. El término "High Precision Event Timer" se utiliza entonces dentro del administrador de controladores para describir 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 utilizan el HPET físico de Intel de 15 MHz, las características del sistema operativo que se pretendía que cumpliera el HPET ya existían en gran medida en Windows XP, aunque con una especificación diferente (la de 2002 en lugar de la de 2005) y, por lo tanto, con una capacidad reducida. En términos de implementación física en Windows XP SP3, las IRQ0 e IRQ8 se asignan normalmente a un "Temporizador de eventos de alta precisión" al usar ACPI HAL (versión 5.1.2600.5512), aunque la llamada a la API QueryPerformanceFrequency devuelve un valor relacionado con la velocidad de reloj nominal del procesador (por ejemplo, 2,6 GHz) o PMTIMER (3,579545 MHz) en lugar del valor especificado por Intel HPET de 15 MHz que se obtendría con Windows Vista. Esta anomalía genera confusión sobre el significado de "HPET" en dichos sistemas, pero claramente no se trata del dispositivo Intel de 15 MHz en esos casos. Cabe destacar que esta asignación de IRQ que menciona "HPET" y la relación de reloj que no corresponde a HPET se pueden encontrar tanto en sistemas Intel como AMD, independientemente de si utilizan o no la anulación de arranque /USEPMTIMER. Dado que la especificación original para 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 QueryPerformanceFrequency la que puede aclarar cómo se proporciona realmente este contador de "alta precisión". 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 multinúcleo de AMD expusieron un problema con las lecturas de QueryPerformanceCounter derivadas del TSC, ya que se veían afectadas por variaciones de velocidad de espectro ensanchado y administración de energía. Si bien esto finalmente se resolvió en diseños de procesadores posteriores al hacer que el reloj del TSC fuera independiente del reloj de la CPU, el PM Timer en sistemas ACPI se convirtió en la fuente de contador preferida, lo que requería una anulación /USEPMTIMER en el archivo BOOT.INI de Windows para forzar 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 clara ventaja de ser independiente de la frecuencia de la CPU y, aun así, proporciona una resolución y precisión submicrosegundo muy razonables. Irónicamente, las altísimas tasas de conteo 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: existe un límite superior para la utilidad de un contador que se desborda prematuramente. También puede resultar molesto que las velocidades de procesamiento cada vez mayores de los diseños de procesadores más recientes reduzcan aún más este intervalo de tiempo útil. Por lo tanto, no sorprende que los sistemas PMTIMER e Intel HPET utilicen una tasa fija claramente especificada, diseñada específicamente para producir resoluciones en el rango submicrosegundo, lo que les permite medir durante períodos más largos que los posibles con TSC. Con o sin el interruptor /PMTIMER, la parte de "evento" de la especificación HPET solo puede emularse utilizando otra fuente de temporización, ya que ni una solución TSC subyacente ni una solución PMTIMER 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 (con una resolución máxima posible de 0,9766  ms cuando se utilizan las llamadas a la API timeBeginPeriod - timeEndPeriod). Esta parte de la especificación aún la cumple el dispositivo RTC con la ayuda de software, a pesar de que el administrador de dispositivos cita HPET en las posiciones IRQ0 e IRQ8.

Referencias

  1. 1 2 Intel Corporation (octubre de 2004), Especificación IA-PC HPET (temporizadores de eventos de alta precisión) (revisión 1.0a) (PDF) , consultado el 15 de junio de 2012
  2. "Temporizadores multimedia" . Microsoft. 10 de diciembre de 2007. Consultado el 20 de octubre de 2010 .
  3. "Especificación IA-PC HPET (Temporizadores de eventos de alta precisión)" (PDF) . Intel. Octubre de 2004. Consultado el 30 de agosto de 2022 .
  4. Directrices para proporcionar soporte para temporizadores multimedia , 20 de septiembre de 2002 , consultado el 10 de noviembre de 2009.
  5. "Páginas del manual de FreeBSD: hpet(4)" . www.freebsd.org .
  6. "Capítulo 15. Marcado de tiempo" . Access.redhat.com. Archivado del original el 7 de mayo de 2016. Consultado el 14 de febrero de 2014 .
  7. "El kernel de Linux desactiva HPET para Intel Coffee Lake" . Phoronix .
  8. 1 2 Thomas Gleixner, x86: hpet: Solución alternativa para la estupidez del hardware Enlace obsoleto archivado el 09/07/2012 en archive.today , confirmación fusionada para el kernel de Linux 2.6.36-rc5
  9. 1 2 Control del tiempo en máquinas virtuales VMware (para VMware vSphere 5.0, Workstation 8.0, Fusion 4.0) Archivado el 26/06/2016 en Wayback Machine , página 9