3

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

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

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

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

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

我不想分析代码,我不想重写大量代码,我不想强​​迫用户弄乱 BIOS 或内核权限,我只想让遗留应用程序按他们应该的方式工作。

4

3 回答 3

3

简而言之,您无法通过轻按开关来做到这一点

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

不变的 TSC 将在所有 ACPI P-、C- 中以恒定速率运行。和 T 状态。这是向前发展的架构行为。

这是另一种告诉你没有办法切换回以前的行为的方式


但是,如果你真的喜欢它,你可以尝试一些东西。

rdtsc从可写的IA32_TIME_STAMP_COUNTER中获取其值。
所以你可以在不改变任何程序的情况下“伪造”读取rdtsc,但你需要一个驱动程序。
更改IA32_TIME_STAMP_COUNTER以调整内部时钟计数可能不是那么容易。

我不记得自复位以来是否存在计算内部时钟的性能事件,如果有,那么理论上您只需读取该值并写入IA32_TIME_STAMP_COUNTER
较新的 CPU 还支持IA32_TSC_ADJUST可用于以相对方式调整TSC :从 IA32_TSC_ADJUST 中添加/减去的任何内容都会从IA32_TIME_STAMP_COUNTER中添加/减去。因此,您可以减慢或加快计数器的速度。

无论哪种方式,您都需要:

  • 创建驱动程序以交付给您的用户。可能没有安装它的权限。
  • 要知道 CPU 的确切节流,与 gudok answer 的投票计数相反,性能计数器寄存器是唯一的方法。除非您想挂钩操作系统电源管理器功能/事件并进行有根据的猜测。
  • 将该限制映射到TSC值。
  • 选择更新TSC的频率(非常重要)。
于 2016-02-03T12:06:12.353 回答
0

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

AMD Bulldozer 系列 (15h) CPU 具有新的 MSR:时间戳计数器比率 ( TscRateMsr),如 AMD 优化手册中所述。他们建议 VMM“使用时间戳计数器比率功能来调整来宾 VM 的 TSC 频率”(第 12.16 节),但您也可以使用它来根据当前的频率缩放设置更改比率。

有关时间戳计数器比率 MSR 的更多信息,请参阅AMD 系列 15h 型号 00h-0Fh 处理器的 BIOS 和内核开发人员指南 (BKDG) 中的第 3.12 节“MSR - MSRC000_0xxx” 。

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

于 2016-04-24T11:27:08.693 回答
-1

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

于 2016-02-01T18:44:31.027 回答