Sam*_*ach 3 linux kvm hypervisor linux-kernel
想象一下用于 VM 检测的简单 CPU 计时检查。
static inline unsigned long long rdtsc_diff_vmexit() {
unsigned long long ret, ret2;
unsigned eax, edx;
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
/* vm exit forced here. it uses: eax = 0; cpuid; */
__asm__ volatile("cpuid" : /* no output */ : "a"(0x00));
/**/
__asm__ volatile("rdtsc" : "=a" (eax), "=d" (edx));
ret2 = ((unsigned long long)eax) | (((unsigned long long)edx) << 32);
return ret2 - ret;
}
Run Code Online (Sandbox Code Playgroud)
在真实的硬件上,cpuid 比在 KVM 中运行时花费的时间要少得多。
我正在玩 rdtsc 偏移,我在想是否可以不退出 CPUID?我尝试禁用退出,不出所料,虚拟机没有启动(UEFI 固件根本没有显示,没有串行输出)。
我试图弄清楚为什么会发生这种情况。我能想到的唯一可能导致问题的事情是 CPU 核心/线程的报告。
所以问题是:这可能吗?如果没有,为什么?如果是,我可以使用任何资源来使其正常工作吗?
查看intel手册:
\n\n\nIntel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册卷\n3C:系统编程指南,第 3 部分 订单号:326019-072US 5 月\n2020 年
\n
Section 25.1.2: Instructions That Cause VM Exits Unconditionally\n
Run Code Online (Sandbox Code Playgroud)\nCPUID 中列出的第一条指令。很明显,您不能禁用 CPUID 上的退出。您可以调整 TSC_OFFSET 字段来解决此问题,但您将希望在系统运行时不断纠正其初始偏移量。这1可能会为您提供一些见解。
\n此外,没有规定您只能在退出时解释一个操作码。您承担了退出的费用,因此可能值得逐步执行一些操作码以避免一组快速退出。如果您浏览 usenix 论文,您可能会找到一些关于此的建议。这就是经典:2
\n 归档时间: |
|
查看次数: |
1122 次 |
最近记录: |