给出一个带有constant TSC的x86,这对实时测量非常有用,如何使用TSC在TSC参考周期的“单位”和正常的人类实时单位(例如纳秒)之间进行转换Linux在启动时计算出的校准系数?
也就是说,通过在某个时间间隔的两端进行TSC和时钟测量(例如,使用CLOCK_MONOTONIC
)来确定TSC频率,可以肯定地计算出用户区域中的TSC频率,但是Linux已经做到了这种计算是在启动时进行的,因为它在内部使用TSC来帮助进行计时。
例如,您可以使用dmesg | grep tsc
查看内核的结果:
[ 0.000000] tsc: PIT calibration matches HPET. 2 loops
[ 0.000000] tsc: Detected 3191.922 MHz processor
[ 1.733060] tsc: Refined TSC clocksource calibration: 3192.007 MHz
在更坏的情况下,我猜您可以尝试在运行时从dmesg
中提取结果,但是坦率地说,这似乎很可怕,脆弱,并且各种各样坏的 0 。 / p>
使用内核确定的校准时间有很多优点:
cpuid
叶子0x15公布其TSC频率,因此校准不一定总是必要的。)gettimeofday
和clock_gettime
1 之类的OS计时功能使用的TSC频率某种程度上“一致”。虽然还不是全部,但是使用Linux的TSC校准的一些缺点包括:
0 例如:系统可能未安装dmesg
,您可能无法以常规用户身份运行它,累积的输出可能已经环绕,因此没有如果存在时间更长,则您的grep可能会得到误报,内核消息是英文散文,并且可能会发生变化,可能很难启动子流程等,等等。
1 这是否重要还是有争议的-但是,如果将rdtsc
调用与同样使用OS时间保持功能的代码混合在一起,则可能会提高精度。