gpt4 book ai didi

linux - 像 KVM 这样的虚拟机管理程序是否需要在 CPUID 上退出 VM?

转载 作者:行者123 更新时间:2023-12-03 09:50:57 25 4
gpt4 key购买 nike

想象一下用于 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 内核/线程。
所以问题是:它甚至可能吗?如果不是,为什么?如果是,我可以使用任何资源来使其工作吗?

最佳答案

查看英特尔手册:

Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume3C: System Programming Guide, Part 3 Order Number: 326019-072US May2020

Section 25.1.2: Instructions That Cause VM Exits Unconditionally
CPUID 中列出的第一条指令。很明显,不,您不能在 CPUID 上禁用退出。您可以调整 TSC_OFFSET 字段以解决此问题,但您将希望在系统运行时不断更正其初始偏移量。此 1可能会为您提供一些见解。
此外,没有规定您只能在退出时解释一个操作码。您付出了退出的代价,因此可能值得单步执行一些操作码以避免快速退出。如果您浏览 useenix 论文,您可能会找到一些关于此的建议。这是经典: 2

关于linux - 像 KVM 这样的虚拟机管理程序是否需要在 CPUID 上退出 VM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63214415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com