有什么方法可以触发 RDTSC 的遗留模式?

There is any way to trigger a legacy mode for RDTSC?

我重写了整个问题,人们显然没有理解它。

RDTSC 用于计算 CPU 个周期,并且随着 CPU 节流而变化。

目前,RDTSC 不随 CPU 节流而变化。

一些旧的应用程序,预计 RDTSC 会随着 CPU 节流而变化。

我如何让 RDTSC 满足他们的期望?

我不想分析代码,我不想重写大量代码,我不想强​​迫用户搞乱 BIOS 或内核权限,我只想制作遗留应用正常工作。

使用CPU 性能计数器。它们在 Linux 中可用 perf_event_open 系统调用。或者,您可以通过 运行 perf 实用程序全局测量您的编程需要多少 cpu 个周期。

简单的说,不是轻弹一下就能搞定的

英特尔开发人员手册 3B第 17 章,明确阅读

The invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states. This is the architectural behavior moving forward.

这是另一种方式告诉您无法切换回之前的行为


不过如果你真的喜欢,你可以尝试一下。

rdtsc 从可写的 IA32_TIME_STAMP_COUNTER 中获取值。
因此,您可以 "fake" 读取 rdtsc 而无需更改任何程序,但您需要一个驱动程序。
更改 IA32_TIME_STAMP_COUNTER 以调整内部时钟计数可能不是那么容易。

我不记得自重置后是否有计算内部时钟的性能事件,如果有,那么理论上你只需读取该值并写入 IA32_TIME_STAMP_COUNTER .
较新的 CPU 还支持 IA32_TSC_ADJUST,可用于以相对方式调整 TSC:无论你 [= IA32_TSC_ADJUST 中的 68=] 是 IA32_TIME_STAMP_COUNTER 中的 added/subtracted。所以你可以减慢或加快计数器。

您需要的任何一种方式:

  • 创建驱动程序以交付给您的用户。哪个可能没有安装它的权限。
  • 要知道 CPU 的确切节流,与 gudok 答案的投票计数相反,性能计数器寄存器是唯一的方法。除非你想挂钩 OS 电源管理器 functions/events 并进行有根据的猜测。
  • 将该限制映射到 TSC 值。
  • 选择更新 TSC 的频率(重要)。

我最近出于不相关的原因偶然发现了这个:

A​​MD Bulldozer 系列 (15h) CPU 有一个新的 MSR:时间戳计数器比率 (TscRateMsr),as mentioned in AMD's optimization manual。他们建议使用 VMM "Use the Timestamp Counter Ratio feature to adjust the TSC frequency for guest VMs"(第 12.16 节),但您也可以使用它来根据当前频率缩放设置更改比率。

For more information on the Timestamp Counter Ratio MSR, please refer to section 3.12, "MSRs - MSRC000_0xxx" in the BIOS and Kernel Developer's Guide (BKDG) for AMD Family 15h Models 00h-0Fh Processors.

IDK 如果英特尔有类似的东西;没看过