我有一个用 clang++ 编译的内联程序集:
asm volatile ("LFENCE\n\t"
"RDTSC\n\t"
"shl $32, %%rdx\n\t"
"or %%rdx, %%rax\n\t"
: "=a" (retval)
:: "%rax", "%rdx");
在 OSX 上,上述检查的总成本rdtsc
约为 10-20 个周期。当我在 Linux(不是虚拟机)上编译相同的代码时,大约需要 2500 个周期。这让我怀疑 Linux 正在做一些愚蠢的事情,比如在用户空间中禁用 RDTSC。从这些文章中,看起来至少已经为 Linux 考虑了这一点:
我正在运行 Ubuntu 14.04
问题:
- 内核模式是否只是
rdtsc
真正进入了 Ubuntu 内核? - 如果存在,我如何检测当前设置?
- 以及如何让用户模式
rdtsc
再次工作?
PS:我完全意识到 rdtsc 的测量错误、管道冲洗等问题。我可以忍受它们,并且我会在需要的地方采取预防措施。我只希望 rdtsc 快。