x86架构下TSC是否真的具备不变性?其实现机制探究
Intel x86架构引入了不变TSC(Invariant TSC),但其不变性是如何维持的?
在Intel SDM文档的18.17.4 Invariant Time-keeping章节中提到:
不变TSC基于名为Always Running Timer(ART)的不变计时硬件,该硬件以核心晶体时钟频率运行。CPUID叶15H定义的比率表示ART硬件与TSC之间的频率关系。
TSC与ART的数值关系可表示为:
TSC_Value = (ART_Value * CPUID.15H:EBX[31:0] )/ CPUID.15H:EAX[31:0] + K
若CPUID.15H:EBX[31:0] / CPUID.15H:EAX[31:0]的值≤1,说明ART精度足以维持TSC精度,但实际情况是Intel CPU的核心晶体时钟频率低于TSC:
ART时钟频率低于TSC的补偿需求
Intel SDM文档33.8.3 Tracking Time章节提到,需要额外时钟来保障TSC的更高频率:
- core crystal clock
核心晶体时钟与时间戳计数器频率的比率称为P,可通过CPUID.15H:EBX[31:0]/CPUID.15H:EAX[31:0]计算。核心晶体时钟频率固定且低于时间戳计数器。
这种精度差距需要另一时钟源来补偿。
TSC的细粒度计算逻辑
Intel SDM文档33.8.3 Tracking Time章节同时指出:
- Processor timestamp counter
该计数器以最大非睿频或P1频率递增,其值通过RDTSC指令返回,频率固定。
但在Intel SDM文档33.8.3.1 Time Domain Relationships章节中,给出了TSC计算的更细致定义:
TimeStampValue = (CoreCrystalClockValue * P) + AdjustedProcessorCycles + Software_Offset
其中AdjustedProcessorCycles的定义为:
AdjustedProcessorCycles组件提供与上一次核心晶体时钟上升沿的细粒度距离,具体来说,是以上一次晶体时钟上升沿为起点、与时间戳计数器同频率的周期计数。其值会根据处理器核心时钟频率与最大非睿频(或P1)频率的比率进行调整。
这种更新方式类似内核计时机制,以核心晶体时钟上升沿为“节拍”更新时间,两个节拍之间需要更高精度的时钟源计算间隔时间。看起来核心晶体时钟的周期性上升沿是维持TSC不变性的关键,但TSC在两个节拍之间是否真的以恒定频率递增?
对TSC真正不变性的疑问
根据前文描述,AdjustedProcessorCycles的变化频率与处理器核心时钟相关,而核心时钟是动态变化的,需要通过与最大非睿频(或P1)的比率调整来保证准确性。这依赖于处理器核心时钟频率在两个“节拍”之间保持固定,但事实是否如此?如果核心时钟在节拍间确实固定,那为何还需要ART来执行计时?
或是说,TSC本质上是一种伪不变的计时机制?
内容的提问来源于stack exchange,提问作者wang fuqiang

