问题标签 [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.
c++ - VisualStudio 2010 Express 上的 RDTSC - C++ 不支持默认整数
我尝试rdtsc
在 VisualStudio 2010 上进行测试。这是我的代码:
但我得到了错误:
我应该怎么办?我不想uint64_t
变成DWORD64
. 为什么 VisualStudio 不明白uint64_t
?
linux - 如何在 Linux 中伪造 RDTSC
我目前正在做一个crackme。RDTSC
在 x86 程序集中使用它来获取时间戳以匹配它是否被调试器或其他东西减慢。crackme 本身是 elf32 剥离的二进制文件。
我目前正在使用 Macos + VirtualBox Debian32。
我的策略是保持第一次RDTSC
调用并存储它的eax
and edx
。将其保存在某个地方以供其他rdtsc
调用,我将先前的值eax
和edx
值设置为当前值。我对这个策略没有运气。Crackme仍然认识我。
我通过谷歌搜索,发现 IDAstealth 是另一个可以让你假rdtsc
电话的 Windows 程序。
我在 linux 中寻找类似的东西。有没有办法rdtsc
在linux中设置值?
gcc - ASM 破坏者帮助。您是否需要使用 rdtsc 破坏 ax、dx 或内存?
我不太了解 ASM。我最近遇到了内联 gcc asm,内容如下:
在我看来,这似乎将计数器的低 32 位放入x
32 位无符号整数中。我不明白的是你为什么要破坏ax
和dx
. 这是为了同步,还是出于其他原因?我见过很多rdtsc
例子,但从来没有那种破坏性的ax
和dx
.
另外,关于,我在这里rdtsc
读到,如果你破坏然后 gcc 不会重新排序指令。这是个好建议吗?您对防止重新排序指令有什么建议吗?memory
rdtsc
谢谢
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
实现。)
qemu - QEMU 源代码中 RDTSC 处理程序的代码在哪里?
我正在开发一个应用程序,该应用程序需要我对处理 RDTSC 调用的 QEMU 源代码部分进行一些更改。但是,我无法在庞大的源代码中找到相同的位置。
assembly - 在汇编文件中使用时如何重置 rdtsc。我需要读入前后时钟周期数据
rdtsc 在汇编文件中使用时会停止吗?有标记加注吗?我该如何重置它?我已将第一个时钟标记读入 rdx 寄存器。但是当我等待几秒钟后再次尝试打印时钟周期时,它仍然是相同的数字。
c# - 如何在 C# 中使用 rdtsc?
我正在研究一个性能计数器,它将始终在应用程序内运行,永远是发布版本。因此,它需要尽可能快。
我确实比较了 c#StopWatch
和 c++ rdtsc()
,并且 100 000 000 个周期需要 3 秒rdtsc()
是明显的赢家,而StopWatch
需要 23 秒。
我的问题是我只知道如何rdtsc()
从 c++ 调用。
任何人都可以建议是否有标准的方法,或者我是否必须编写一个托管的 c++ dll?
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?
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 等应用程序如何在进行涡轮增压时实时测量处理器的时钟速度?