我重写了整个问题,人们显然不理解它。
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.
这是告诉您无法切换回之前的行为的另一种方式。
<小时/>但是如果你真的喜欢,你可以尝试一些东西。
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 答案的投票计数相反,性能计数器寄存器是唯一的方法。除非您想 Hook 操作系统电源管理器功能/事件并进行有根据的猜测。
- 将该限制映射到 TSC 值。
- 选择更新 TSC 的频率(非常重要)。
关于assembly - 有什么方法可以触发 RDTSC 的传统模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137786/