发布于 2021-02-07 10:56:58
操作系统存在的大部分原因是抽象低级硬件细节,以便软件(例如应用程序)获得更新/更好的硬件的优势,而不是每次硬件发生变化时都破坏。
例如,你可以得到“文件”(不必关心SCSI、SATA、NVME;或者FAT、NTFS、其他任何东西)、“socket”(不必关心有线以太网、WIFI、infiniband、以及其他任何东西)、“线程”(不必太关心文字CPU)和“虚拟内存”(并且不必关心实际的物理RAM)。
同样,每个操作系统都会提供某种高性能/高精度的定时器API。此API可能在内部使用HPET,也可能不在内部使用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 )。请注意,这里的精度不需要很高(例如,纳秒精度),因为消息传递延迟(例如,当您处理其他消息时,消息在队列中等待您接收它的时间有多长)将使“过高的精度”变得不可用。
https://stackoverflow.com/questions/66050631
复制相似问题