【发布时间】:2020-08-02 09:32:32
【问题描述】:
想象一个用于 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;
}
在真实硬件上,cpuid 将比在 KVM 中运行时花费的时间要少得多。
我在玩 rdtsc 偏移,我在想是否可以不退出 CPUID?我试过禁用退出,不出所料,VM 没有启动(UEFI 固件根本没有出现,没有串行输出)。
我试图弄清楚为什么会这样。我能想到的唯一可能导致问题的事情是报告 CPU 内核/线程。
所以问题是:这甚至可能吗?如果不是,为什么?如果是,我可以使用任何资源来使其正常工作吗?
【问题讨论】:
标签: linux linux-kernel kvm hypervisor