像 KVM 这样的管理程序是否需要在 CPUID 上退出 VM?
Does hypervisor like KVM need to VM-exit on CPUID?
想象一下用于 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 cores/threads.
的报告
所以问题是:这可能吗?如果不是,为什么?如果是,是否有任何资源可以用来让它工作?
查看英特尔手册:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume
3C: System Programming Guide, Part 3 Order Number: 326019-072US May
2020
Section 25.1.2: Instructions That Cause VM Exits Unconditionally
CPUID 中列出的第一条指令。非常清楚,不,您不能禁用 CPUID 上的退出。您可以调整 TSC_OFFSET 字段来解决这个问题,但您会希望在系统运行时不断更正其初始偏移量。此 1 可能会为您提供一些见解。
此外,没有规定您只能在出口处解释一个操作码。您承担了退出的代价,因此可能值得单步执行一些操作码以避免快速退出。如果您浏览 usenix 文件,您可能会找到一些关于此的建议。这是经典:2
想象一下用于 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 cores/threads.
的报告所以问题是:这可能吗?如果不是,为什么?如果是,是否有任何资源可以用来让它工作?
查看英特尔手册:
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3C: System Programming Guide, Part 3 Order Number: 326019-072US May 2020
Section 25.1.2: Instructions That Cause VM Exits Unconditionally
CPUID 中列出的第一条指令。非常清楚,不,您不能禁用 CPUID 上的退出。您可以调整 TSC_OFFSET 字段来解决这个问题,但您会希望在系统运行时不断更正其初始偏移量。此 1 可能会为您提供一些见解。
此外,没有规定您只能在出口处解释一个操作码。您承担了退出的代价,因此可能值得单步执行一些操作码以避免快速退出。如果您浏览 usenix 文件,您可能会找到一些关于此的建议。这是经典:2