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

时间:2016-02-01 18:33:56

标签: assembly rdtsc

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

RDTSC用于计算CPU周期,它随CPU限制而变化。

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

一些旧的应用程序,期望RDTSC随CPU限制而变化。

我如何让RDTSC给他们期望的东西?

我不想分析代码,我不想重写大量代码,我不想让用户搞砸BIOS或内核权限,我只是想要使遗留应用程序按预期工作。

3 个答案:

答案 0 :(得分:2)

简单地说,只需轻按一下开关即可完成

英特尔开发人员手册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答案的投票数相反,性能计数器寄存器是唯一的方法。除非你想挂钩操作系统电源管理器功能/事件,并采用有根据的猜测。
  • 将该限制映射到 TSC 值。
  • 选择更新 TSC (非平凡)的频率。

答案 1 :(得分:0)

我最近因为无关的原因偶然发现了这一点:

AMD Bulldozer系列(15h)CPU具有新的MSR:时间戳计数器比率(TscRateMsr),as mentioned in AMD's optimization manual。他们建议VMM“使用时间戳计数器比率功能调整来宾VM的TSC频率”(第12.16节),但您也可以使用它来根据当前的频率调整设置更改比率。

  

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

IDK,如果英特尔有类似的话;我没看过。

答案 2 :(得分:-1)

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