操作系统存在的大部分原因是抽象低级硬件细节,以便软件(例如应用程序)获得更新/更好的硬件的优势,而不是每次任何硬件更改时都会破坏。
举些例子; 你得到“文件”(不必关心 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)。请注意,这里的精度不需要太高(例如纳秒精度),因为消息传递延迟(例如,消息在队列中等待您在处理其他消息时接收它的时间)会使“精度过高“无论如何都无法使用。