2

我目前对使用 HPET 计时器获得微秒分辨率计时感到好奇。关于在线使用此设备的信息似乎很少。我确实找到了 Linux 提供 HPET 驱动程序的信息,并且源代码中有一个示例演示了用户模式 ​​API,还有一个旧的邮件列表线程似乎表明(曾经?)一个内核模式 API 也可以使用它,但除此之外的文档很少。

到目前为止,我还没有找到任何与 Windows HPET 驱动程序等效的东西。Windows 是否提供某种接口、内核模式的用户模式以在 x86 平台上访问和使用 HPET?谷歌在这里让我失望了,因为它似乎或多或少地充斥着论坛帖子和文章,询问出于性能原因启用/禁用 HPET。

4

1 回答 1

6

操作系统存在的大部分原因是抽象低级硬件细节,以便软件(例如应用程序)获得更新/更好的硬件的优势,而不是每次任何硬件更改时都会破坏。

举些例子; 你得到“文件”(不必关心 SCSI 与 SATA 与 NVME;或 FAT 与 NTFS 与其他任何东西)和“套接字”(不必关心有线以太网与有线以太网)。 WIFI 与 infiniband 与其他任何东西),以及“线程”(不必太关心文字 CPU)和“虚拟内存”(不必关心实际的物理 RAM)。

以同样的方式;每个操作系统都会提供某种高性能/高精度定时器 API。此 API 可能会或可能不会在内部使用 HPET(但您没有理由关心它是否使用,因为您不希望不断中断的损坏代码)。

适用于现代 80x86 系统;高性能/高精度计时器 API 很可能会使用 CPU 的 TSC 和本地 APIC 计时器(因为它更好/更精确/开销更低)并且不会使用 HPET。对于极旧的 80x86 计算机,它可能会使用 PIT(仅仅是因为硬件中不存在更好的选择,包括 HPET)。对于其他架构(ARM、Sparc、PowerPC...),相同的 API 将使用对该架构真正有意义的任何内容。

本质上; 如果存在任何确实可以直接“非抽象”访问底层 HPET 设备的操作系统;那么那个操作系统就是一个脆弱的烂摊子,没有做好它的工作,应该尽快放弃。

对于 Windows;API 分为 3 个部分:

a) 高精度时间戳 ( QueryPerformanceCounter(), GetSystemTimePreciseAsFileTime())。请注意,出于安全原因,这些可能会被故意“削弱”(使时序侧信道攻击更加困难,因为 CPU 的 TSC 有点太好了)。

b) 高精度时间延迟(Sleep()Waitable Timer Objects - 请参阅https://docs.microsoft.com/en-us/windows/win32/sync/waitable-timer-objects)。

c)“足够高”的精确时间事件(SetTimer()WM_TIMER消息 - 请参阅https://docs.microsoft.com/en-us/windows/win32/winmsg/using-timers)。请注意,这里的精度不需要太高(例如纳秒精度),因为消息传递延迟(例如,消息在队列中等待您在处理其他消息时接收它的时间)会使“精度过高“无论如何都无法使用。

于 2021-02-07T02:56:58.293 回答