问题标签 [rdtsc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
12231 浏览

c++ - VisualStudio 2010 Express 上的 RDTSC - C++ 不支持默认整数

我尝试rdtsc在 VisualStudio 2010 上进行测试。这是我的代码:

但我得到了错误:

我应该怎么办?我不想uint64_t变成DWORD64. 为什么 VisualStudio 不明白uint64_t

0 投票
1 回答
721 浏览

linux - 如何在 Linux 中伪造 RDTSC

我目前正在做一个crackme。RDTSC在 x86 程序集中使用它来获取时间戳以匹配它是否被调试器或其他东西减慢。crackme 本身是 elf32 剥离的二进制文件。

我目前正在使用 Macos + VirtualBox Debian32。

我的策略是保持第一次RDTSC调用并存储它的eaxand edx。将其保存在某个地方以供其他rdtsc调用,我将先前的值eaxedx值设置为当前值。我对这个策略没有运气。Crackme仍然认识我。

我通过谷歌搜索,发现 IDAstealth 是另一个可以让你假rdtsc电话的 Windows 程序。

我在 linux 中寻找类似的东西。有没有办法rdtsc在linux中设置值?

0 投票
1 回答
384 浏览

gcc - ASM 破坏者帮助。您是否需要使用 rdtsc 破坏 ax、dx 或内存?

我不太了解 ASM。我最近遇到了内联 gcc asm,内容如下:

在我看来,这似乎将计数器的低 32 位放入x32 位无符号整数中。我不明白的是你为什么要破坏axdx. 这是为了同步,还是出于其他原因?我见过很多rdtsc例子,但从来没有那种破坏性的axdx.

另外,关于,我在这里rdtsc读到,如果你破坏然后 gcc 不会重新排序指令。这是个好建议吗?您对防止重新排序指令有什么建议吗?memoryrdtsc

谢谢

0 投票
9 回答
15060 浏览

c - 使用背靠背 rdtsc 进行负时钟周期测量?

我正在编写一个 C 代码来测量获取信号量所需的时钟周期数。我正在使用 rdtsc,在对信号量进行测量之前,我连续两次调用 rdtsc 来测量开销。我在一个 for 循环中重复了很多次,然后我使用平均值作为 rdtsc 开销。

首先使用平均值是否正确?

尽管如此,这里的大问题是有时我会得到开销的负值(不一定是平均的,但至少是 for 循环内的部分)。

这也影响了操作所需的 cpu 周期数的连续计算,sem_wait()有时结果也是负数。如果我写的不清楚,这里有我正在处理的代码的一部分。

为什么我会得到这样的负值?


(编者注:请参阅Get CPU cycle count?获取获取完整 64 位时间戳的正确且可移植的方法。"=A"当为 x86-64 编译时,asm 约束只会获取低 32 位或高 32 位,具体取决于寄存器分配是否发生选择 RAX 或 RDX 作为uint64_t输出。它不会选择edx:eax.)

(编辑的第二条注释:哎呀,这就是为什么我们得到负面结果的答案。仍然值得在这里留下一个注释作为警告不要复制这个rdtsc实现。)


0 投票
1 回答
577 浏览

qemu - QEMU 源代码中 RDTSC 处理程序的代码在哪里?

我正在开发一个应用程序,该应用程序需要我对处理 RDTSC 调用的 QEMU 源代码部分进行一些更改。但是,我无法在庞大的源代码中找到相同的位置。

0 投票
1 回答
852 浏览

assembly - 在汇编文件中使用时如何重置 rdtsc。我需要读入前后时钟周期数据

rdtsc 在汇编文件中使用时会停止吗?有标记加注吗?我该如何重置它?我已将第一个时钟标记读入 rdx 寄存器。但是当我等待几秒钟后再次尝试打印时钟周期时,它仍然是相同的数字。

0 投票
0 回答
30 浏览

c# - 如何在 C# 中使用 rdtsc?

我正在研究一个性能计数器,它将始终在应用程序内运行,永远是发布版本。因此,它需要尽可能快。

我确实比较了 c#StopWatch和 c++ rdtsc(),并且 100 000 000 个周期需要 3 秒rdtsc()是明显的赢家,而StopWatch需要 23 秒。

我的问题是我只知道如何rdtsc()从 c++ 调用。

任何人都可以建议是否有标准的方法,或者我是否必须编写一个托管的 c++ dll?

0 投票
1 回答
990 浏览

assembly - How to modify the implementation of x86 assembly instructions on QEMU Virtual Machine

I want to modify the implementation of rdtsc assembly instruction, i.e., I want to modify at the fundamental level, what happens when rdtsc assembly instruction is invoked.

I am working on a QEMU Virtual Machine running on an Intel Core2 Duo processor. The Instruction Set Architecture is i686.

To locate the portion of QEMU Source Code dealing with rdtsc call, I did a grep over the entire source code and found the function helper_rdtsc() in the file target-i386/misc_helper.c to be the key suspect. So I did the following modification in this file:

Then I compiled QEMU from this modified source code, mounted Ubuntu 12.04 as the Guest-OS, and ran a test C code which accessed rdtsc through the following function:

Naturally, on executing this test code, I expected the value returned through tick to be less than myconst. Also I expected the statement rdtsc return = <somevalue> //printed from source code to be printed as a part of the rdtsc call. However none of it happened.

Am I modifying the right portion of the QEMU source code? If yes, is there an error in the modifications I have made? If no, where should I look for in the source code to do the desired modification?

0 投票
1 回答
3566 浏览

c++ - 如何计算CPU核心的频率

我正在尝试使用 RDTSC,但似乎我的方法可能是错误的,以获得核心速度:

它总是打印出大约 3.3 GHz 的值,这是错误的,因为 Turbo Boost 之类的东西不时开启,而我的内核肯定会跳到 4.3 GHz。让我交叉引用这个想法背后的一些文章。

首先(http://users.utcluj.ro/~ancapop/labscs/SCS2.pdf):“处理器内核上的 TSC 不同步。因此不确定进程在执行期间是否从一个内核迁移到另一个内核,测量不会受到影响。为了避免这个问题,测量进程的亲和度必须设置为只有一个核心,以防止进程迁移。这告诉我,RDTSC 应该使用我设置的关联掩码为我的线程所在的每个内核返回不同的值,这很棒。

其次,请查看这篇文章http://randomascii.wordpress.com/2011/07/29/rdtsc-in-the-age-of-sandybridge/): “如果您需要一个跨内核工作且可用于测量时间的一致计时器,那么这是个好消息。如果您想测量实际的 CPU 时钟周期,那么您就不走运了。如果您希望在广泛的范围内保持一致性的 CPU 系列,那么它就是你。更新:英特尔系统编程指南的第 16.11 节记录了时间戳计数器的这种行为。粗略地说,它说在旧处理器上时钟速率会发生变化,但在较新的处理器上它保持一致. 它最后说,Constant TSC,“这是向前发展的架构行为。” 好的,这告诉我 RDTSC 保持一致,这使我的上述结果很有意义,因为我的 CPU 内核的额定频率为标准 3.3 GHz...

这真的引出了一个问题,英特尔的 Turbo Boost Technology Monitor 和 Piriform 的 Speccy 和 CPUID 的 CPU-Z 等应用程序如何在进行涡轮增压时实时测量处理器的时钟速度?

0 投票
3 回答
1511 浏览

intel - 有没有比 cpuid 更便宜的序列化指令?

我已经看到了相关的问题,包括这里这里,但似乎唯一提到的序列化指令rdtsccpuid

不幸的是,cpuid在我的系统上大约需要 1000 个周期,所以我想知道是否有人知道更便宜的(更少的周期,没有读取或写入内存)序列化指令?

我看了看iret,但这似乎改变了控制流,这也是不可取的。

我实际上已经查看了 Alex 的关于 的回答中链接的白皮书rstscp,但它说:

RDTSCP 指令等到所有先前的指令都已执行后才读取计数器。然而,后续指令可能在执行读取操作之前开始执行。

第二点似乎是让它不太理想。