我重写了整个问题,人们显然没有理解它。
RDTSC用于计算CPU周期,它随CPU限制而变化。
目前,RDTSC并不随CPU限制而变化。
一些旧的应用程序,期望RDTSC随CPU限制而变化。
我如何让RDTSC给他们期望的东西?
我不想分析代码,我不想重写大量代码,我不想让用户搞砸BIOS或内核权限,我只是想要使遗留应用程序按预期工作。
答案 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 。所以你可以放慢速度或加速计数器。
你需要的任何一种方式:
答案 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周期数。