Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 有没有办法触发RDTSC的传统模式?_Assembly_Rdtsc - Fatal编程技术网

Assembly 有没有办法触发RDTSC的传统模式?

Assembly 有没有办法触发RDTSC的传统模式?,assembly,rdtsc,Assembly,Rdtsc,我重写了整个问题,人们显然不理解 RDTSC用于计算CPU周期,它随CPU节流而变化 目前,RDTSC不随CPU调节而变化 一些旧的应用程序希望RDTSC随CPU调节而变化 我如何让RDTSC满足他们的期望 我不想分析代码,我不想重写大量代码,我不想强迫用户干扰BIOS或内核权限,我只想让遗留应用程序正常工作。使用CPU性能计数器。它们在Linux中可以通过使用perf\u event\u opensyscall获得。或者,您也可以通过运行perf实用程序来全局测量您的编程所需的cpu周期。简单

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

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

目前,RDTSC不随CPU调节而变化

一些旧的应用程序希望RDTSC随CPU调节而变化

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


我不想分析代码,我不想重写大量代码,我不想强迫用户干扰BIOS或内核权限,我只想让遗留应用程序正常工作。

使用CPU性能计数器。它们在Linux中可以通过使用
perf\u event\u open
syscall获得。或者,您也可以通过运行
perf
实用程序来全局测量您的编程所需的cpu周期。

简单地说,您不可能只需轻按开关即可完成此操作

《英特尔开发人员手册3B》第17章明确规定

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

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


然而,如果你真的喜欢,你可以尝试一些东西

rdtsc
从IA32_TIME_STAMP_计数器获取其值,该计数器是可写的。
因此,您可以在不更改任何程序的情况下“伪造”读取
rdtsc
,但您需要一个驱动程序。
更改IA32_TIME_STAMP_计数器以调整内部时钟计数可能并不容易

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

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

  • 创建要交付给用户的驱动程序。可能没有安装它的权限
  • 要知道CPU的确切节流,与gudok answer的投票计数相反,性能计数器寄存器是唯一的方法。除非您想挂接OS power manager函数/事件并进行有根据的猜测
  • 将该节流映射为TSC值
  • 选择更新TSC的频率(非平凡)

我最近无意中发现了这一点,原因与此无关:

AMD推土机系列(15h)CPU有一个新的MSR:时间戳计数器比率(
TscRateMsr
)。他们建议VMMs“使用时间戳计数器比率功能调整来宾VM的TSC频率”(第12.16节),但您也可以使用它根据当前频率缩放设置更改比率

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


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

看:我以前看过这两个,这有助于理解问题,但不要修复它。我不是在写一个新的应用程序,我在努力让遗留的应用程序工作,而不会对它们进行太多的黑客攻击。。。我不能到处替换他们的大部分代码。人们一定恨我,每次我问问题,我都会立即被否决,没有人解释为什么。如果我理解正确,你已经有了使用RDTSC的遗留应用程序,你真的在寻找一种方法来运行现有的二进制文件,只需很少甚至不做任何修改,这样它们就可以像在旧硬件上一样工作。我只希望你不要雇佣那些在新项目中编写原始代码的人。@PeterCordes:我从1995年开始为SMP x86构建并行编程工具。我们一直使用TSC作为计时来源。是的,在过去糟糕的日子里,有时线程从一个CPU切换到另一个CPU会给我们带来不一致的TSC计数。这不是不可理解的;你只需要运行几次计时,然后抛出无意义的答案。是的,即使是在16个核心系统上,现在也要好得多。在我测量之后,我如何将信息反馈给程序?编辑:也是在windows上。
perf\u event\u open
设计用于测量代码的细粒度和平。不幸的是,我不能推荐任何类似的Windows工具(很可能您需要使用编译器内部函数来设置CPU计数器)。如果您正在编写驱动程序,性能计数器可能是最简单的方法。您可以获得自上次调整TSC以来的核心时钟数,这正是您需要的数字。即使您处于内核模式,可以以较低的开销访问操作系统对当前时钟速度的想法,但这在过去的turbo up/down事件历史中并不平均。而且Skylake在操作系统将CPU频率决策权交给内核时效果最好,因此它可以比操作系统检查频率更频繁地调整频率。请记住,您的Windows驱动程序或Linux内核模块应该告诉操作系统,它不能再将TSC用作每天时间的时间源。每个核心只有一个TSC,而不是每个进程或每个线程,因此,在Linux上,处理它会破坏
gettimeofday()
。将带有
gettimeofday
实现的代码页映射到每个进程的地址空间。在没有
constant\u tsc
功能的系统上,它从不使用
syscall
或任何东西,而是使用
rdtsc
停留在用户空间中。因此,在Linux上,引导后时间从TSC更改为非TSC可能会有问题。“IDK!”彼得考德斯:她确实说了与他回答的计票结果相反的话。我想她基本上说古多克是对的,但这并没有反映在投票中。@MichaelPetch:啊,我明白了。我想我在某一点上明白了这一点,但当我写完我的论文时,我忘了