从 Windows 8.1 开始,驱动程序可以使用 ExXxx计时器 例程来管理高分辨率计时器。 高分辨率计时器的准确性仅受系统时钟支持的最大分辨率限制。 相比之下,限制为默认系统时钟分辨率的计时器的准确度要明显降低。
但是,高分辨率计时器要求系统时钟中断(至少暂时)以更高的速率发生,这往往会增加能耗。 因此,驱动程序应仅在计时器准确性至关重要时使用高分辨率计时器,并在所有其他情况下使用默认分辨率计时器。
若要创建高分辨率计时器,WDM 驱动程序调用 ExAllocateTimer 例程,并在 Attributes 参数中设置EX_TIMER_HIGH_RESOLUTION标志。 当驱动程序调用 ExSetTimer 例程以设置高分辨率计时器时,作系统会根据需要增加系统时钟的分辨率,以便计时器过期的时间更准确地对应于 DueTime 和 Period 参数中指定的名义过期时间。
Kernel-Mode Driver Framework (KMDF) 驱动程序可以调用 WdfTimerCreate 方法来创建高分辨率计时器。 在此调用中,驱动程序将指向 WDF_TIMER_CONFIG 结构的指针作为参数传递。 若要创建高分辨率计时器,驱动程序将此结构的 UseHighResolutionTimer 成员设置为 TRUE。 此成员是自 Windows 8.1 和 KMDF 版本 1.13 起便属于该结构的一部分。
控制计时器准确性
例如,对于在 x86 处理器上运行的 Windows,系统时钟时钟周期之间的默认间隔通常约为 15 毫秒,系统时钟时钟周期之间的最小间隔约为 1 毫秒。 因此,默认分辨率的计时器(在未设置EX_TIMER_HIGH_RESOLUTION标志时由ExAllocateTimer创建)的超时时间只能控制精度到大约15毫秒,但高分辨率计时器的超时时间可以精确控制到一毫秒。
如果驱动程序为默认分辨率计时器指定相对过期时间,计时器的过期时间可能早于或晚于指定的过期时间大约 15 毫秒。 如果驱动程序为高分辨率计时器指定相对过期时间,计时器可以在指定过期时间后大约一毫秒过期,但不会提前过期。 有关系统时钟分辨率与计时器准确性之间的关系的详细信息,请参阅 计时器准确性。
如果未设置高分辨率计时器,作系统通常会以默认速率运行系统时钟。 但是,如果设置了一个或多个高分辨率计时器,作系统可能需要在其最大速率运行系统时钟,至少在这些计时器过期前的一部分时间。
为了避免不必要的增加电源消耗,作系统仅在需要满足高分辨率计时器的计时要求时才以最大速率运行系统时钟。 例如,如果高分辨率计时器是定期计时器,并且其时间段跨越多个默认系统时钟时钟周期,则作系统可能仅在每次过期之前的计时器时间段内以最大速率运行系统时钟。 在计时器时段的其余时间,系统时钟以默认速率运行。
为了防止过度消耗电源,驱动程序应避免将长时间运行的高分辨率计时器的时间段设置为小于系统时钟时钟周期之间的默认间隔的值。 否则,操作系统将被迫以最大速率连续运行系统时钟。
从 Windows 8 开始,驱动程序可以调用 ExQueryTimerResolution 例程来获取系统时钟支持的计时器分辨率范围。
与 ExSetTimerResolution 的比较
驱动程序可以调用 ExSetTimerResolution 例程来更改连续系统时钟中断之间的时间间隔。 例如,驱动程序可以调用此例程,将系统时钟从默认速率更改为最大速率以提高计时器准确性。 但是,与使用 ExAllocateTimer 创建的高分辨率计时器相比,使用 ExSetTimerResolution 有几个缺点。
首先,调用 ExSetTimerResolution 以暂时提高系统时钟速率后,驱动程序必须再次调用 ExSetTimerResolution ,才能将系统时钟还原为其默认速率。 否则,系统时钟计时器会持续以最大速率生成中断,这可能会导致过度消耗电量。
其次,使用 ExSetTimerResolution 例程的驱动程序无法像作系统对高分辨率计时器那样有效地优化其对更高系统时钟速率的临时使用。 因此,系统时钟在最大速率下运行的时间比严格需要的时间要多。
第三,如果多个驱动程序同时使用 ExSetTimerResolution 来提高计时器准确性,则系统时钟可能会长时间以最大速率运行。 相比之下,作系统全局协调多个高分辨率计时器的作,以便系统时钟仅在满足这些计时器的计时要求时才以最大速率运行。
最后,使用 ExSetTimerResolution 本质上比使用高分辨率计时器不那么准确。 驱动程序调用 ExSetTimerResolution 以将系统时钟提高到其最大速率(通常是每毫秒的时钟周期数)后,驱动程序可能会调用例程(如 KeSetTimerEx )来设置计时器。 如果在此调用中,驱动程序指定相对过期时间,计时器的过期时间可能早于或晚于指定过期时间的大约一毫秒。 但是,如果为高分辨率计时器指定了相对过期时间,计时器的过期时间可能比指定的过期时间晚约一毫秒,但不会提前过期。