确定Linux上的TSC频率

Bee*_*ope 8 linux performance x86 rdtsc

给定具有恒定TSC的x86 ,这对于测量实时非常有用,如何在启动时使用Linux计算的TSC校准因子在TSC参考周期的"单位"和正常人类实时单位(如纳秒)之间进行转换

也就是说,当然可以通过CLOCK_MONOTONIC在某个时间间隔的两端进行TSC和时钟测量(例如,用)来计算用户区中的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
Run Code Online (Sandbox Code Playgroud)

在更糟糕的情况下,我猜你可以尝试dmesg在运行时grep结果,但坦率地看起来很可怕,脆弱和各种各样的坏0.

使用内核确定的校准时间的优点很多:

  1. 您不必自己编写TSC校准例程,并且您可以非常确定Linux版本是最佳的.
  2. 当你使用现有的二进制文件(例如,最近芯片开始使用cpuid叶片0x15 宣传其TSC频率,因此不一定需要进行校准)时,您会自动在TSC校准中获取新技术.
  3. 您不会通过TSC校准减慢启动速度.
  4. 您在每次运行过程中使用相同的TSC值(至少在重新启动之前).
  5. 您的TSC频率与OS时间保持功能(如1gettimeofdayclock_gettime1)使用的TSC频率在某种程度上"一致" .
  6. 内核能够在引导时,在内核模式下很早地进行TSC校准,没有中断的祸害,其他进程,并且能够访问底层硬件定时器方向作为其校准源.

然而,使用Linux的TSC校准的一些缺点包括:

  1. 它不适用于每个Linux安装(例如,可能不使用tsc clocksource的安装)或其他操作系统上的安装,因此您可能仍然无法编写后备校准方法.
  2. 有理由相信"最近"校准可能比旧校准更准确,特别是在开机后立即进行校准:晶体行为可能会发生变化,特别是在温度变化时,因此通过这样做可以获得更准确的频率手动接近您将使用它的点.

0例如:系统可能没有dmesg安装,您可能无法以普通用户身份运行它,累积的输出可能已经缠绕,因此线路不再存在,您可能会在grep上获得误报,内核消息是英文散文,可能会有变化,可能很难启动子流程等等.

1这是否有争议 - 但如果您将rdtsc调用与使用OS时间保持的代码混合,则可能会提高精度.