assembly - 有什么方法可以触发 RDTSC 的传统模式吗?

标签 assembly rdtsc

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

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

目前,RDTSC 不随 CPU 限制而变化。

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

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

我不想分析代码,我不想重写大量代码,我不想强​​迫用户弄乱 BIOS 或内核权限,我只想让旧版应用程序像以前一样工作他们应该。

最佳答案

简单地说,您无法通过轻按开关来完成

英特尔开发人员手册 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.

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

<小时/>

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

rdtscIA32_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 答案的投票计数相反,性能计数器寄存器是唯一的方法。除非您想 Hook 操作系统电源管理器功能/事件并进行有根据的猜测。
  • 将该限制映射到 TSC 值。
  • 选择更新 TSC 的频率(非常重要)。

关于assembly - 有什么方法可以触发 RDTSC 的传统模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137786/

相关文章:

c++ - 将参数从 C++ 传递到 cout 中的程序集

c++ - 使用 Intel 编译器 : looking at the assembly 的 Windows 和 Linux 之间的性能差异

assembly - Shellcoders手册中的汇编指令不一致

c - 读取显示奇怪值的时间戳计数器

c - 为什么第一个 printf 需要更长的时间?

linux - 使用 rdtsc 计算秒数

assembly - 尝试比较和计算大于、小于或等于某个值的数组元素

仅使用按位操作将 float 转换为 int (float2int)

linux - 英特尔赛扬 64 位汇编程序上的 RDTSC

c++ - 在 C++ 代码中使用嵌入式汇编语言进行错误分析