在微软 Windows 系统将时间戳计数器(TSC)作为高精度计时的首选基准十多年后,Linux 内核如今也正式跟进,将 TSC 设定为 x86 处理器的硬性要求。这一转变标志着 Linux 结束了对过于老旧的 x86 硬件长达数十年的遗留支持。

AMD 首款自行研发的 K5 处理器将因此被从 Linux 内核支持列表中移除

近期提交到 Linux 内核的一项代码修改彻底移除了允许 x86 内核在无 TSC 支持下进行构建的配置逻辑。该提交名为“x86/cpu: Make CONFIG_X86_TSC unconditional”,这意味着由于目前仍在支持范围内的 x86 CPU 均已具备该功能,TSC 支持已被设定为无条件要求。尽管这听起来像是一次常规的内核清理,但它实际上终结了 Linux 支持极老旧 x86 硬件的时代。据悉,TSC 是自英特尔奔腾(Pentium)时代起就存在的一种特殊 64 位寄存器,充当处理器计数器。相比于高精度事件定时器(HPET)或 ACPI 电源管理(PM)定时器等平台定时器,TSC 可以提供更高分辨率的时间测量,且由于其本身就是 CPU 寄存器,访问速度要快得多。

性能提升一直是软硬件发展的关键指标,这也解释了为何 TSC 拥有如此高的优先级。如今,每一款现代英特尔和 AMD 处理器都配备了 64 位 TSC,并且可以通过 RDTSC 和 RDTSCP 等指令进行读取。由于 Linux 此前一直保留着对追溯到 i486 时代硬件的支持,因此在历史上不得不为那些没有 TSC 或无法可靠使用 TSC 的处理器保留冗余代码。然而,随着 Linux 7.0 放弃对英特尔 486 处理器的支持,以及随后的开发周期移除了其他阻碍 TSC 普及的旧款处理器,这些“历史包袱”已显得多余。内核现在可以安全地假定 x86 处理器均配备了 TSC。因此,这项新变更并非突然让 Linux 依赖于现代 PC 所不具备的功能,而是终于清除了存在数十年的兼容性代码。

值得注意的是,微软在更早的时候就达到了类似的发展阶段,尽管 Windows 平台的情况有所不同。微软在 Windows 2000 和 Windows XP 中引入了查询性能计数器(QPC)作为高分辨率性能计数器。早期的系统在面临处理器 TSC 不变性或未同步的问题时,Windows 会回退使用 HPET 或 ACPI PM 等平台定时器。到了 Windows 7 和 Windows Server 2008 R2,系统已经开始在能同步处理器独立计数器的设备上,使用恒定速率的 TSC 作为 QPC 的基础。Windows 8、Windows 8.1 及其对应的服务器版本更是进一步将 TSC 作为性能计数器的基础,并改善了大型系统的同步功能。即便如此,微软至今仍在文档中保留了对 TSC 稳定性和同步情况的检查机制,并在 TSC 不适用时允许选择其他硬件定时器;同时也警告开发者避免直接读取 TSC,而是推荐使用能良好处理硬件和虚拟化差异的 QPC。

业界普遍认为,微软和 Linux 在条件允许时偏爱 TSC 是出于极其充分的性能考量。读取基于 TSC 的 QPC 仅需几十到几百个 CPU 周期,并能有效避免内核态转换。而回退到基于主板的定时器则会将耗时推高至约 0.8 到 1.0 微秒,且无法避免内核转换,这种性能差距是十分显著的。在经历了多年对 TSC 可靠性问题进行检测、校准和修补之后,Linux 终于也正式卸下了这一最古老的兼容性