Windows 是否提供对 HPET 的任何 API 访问?

an *_*wig 2 windows x86 hpet

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

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

Bre*_*dan 6

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

举些例子; 你会得到“文件”(不必关心 SCSI 与 SATA 与 NVME;或 FAT 与 NTFS 与其他任何东西)和“套接字”(不必关心有线以太网与 NVME)。 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(),可等待计时器对象 - 请参阅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)。请注意,这里的精度不需要非常高(例如纳秒精度),因为消息传递延迟(例如,当您处理其他消息时,消息在队列中等待您接收的时间长度)会使“精度过高” "反正不能用。

  • 您可能想确切地澄清如何使用 b) 和 c)“获得微秒分辨率计时”,这些对我来说似乎很奇怪。 (2认同)