我有一台带有 Intel E5-26xx v3 处理器的Ubuntu(在14.04或16.04上尝试此操作)KVM主机。
我需要向访客VM公开某个标志,但是QEMU / libvirt没有公开,即使我在我的VM libvirt XML定义中使用cpu mode='host-passthrough'
。我相信这是由于此文件/usr/share/libvirt/cpu_map.xml
中定义的内容,其中我想要公开的标志未定义。
所以,我希望能够修改cpu_map.xml
并手动添加CPU标志定义,但我不知道如何/在哪里可以获得CPUID
函数的结果以及它们是否在ebx
/ ecx
等等。任何指针都会受到赞赏。
免责声明:我没有插手进入CPU架构,所以我的知识在这方面非常有限。
答案 0 :(得分:0)
从CPUID
instruction检索结果非常简单:
CPUID
指令的可用性EAX
和ECX
个寄存器设置为特定值CPUID
EAX
,EBX
,ECX
和EDX
个寄存器的值许多网站汇总了对结果的解释。其中一个是LowLevel。其中许多只涵盖可能结果的一部分。
A thread on the specifics of CPUID in VMs将这些基本知识扩展到:
UserCPUID
是使用二进制翻译时本机运行的来宾 Ring-3 代码可见的内容。通过二进制转换,通常只有 Ring-0 (或IOPL-3)代码才能进行二进制转换。大多数 Ring-3 代码本机运行(在我们称之为“直接执行”的模式下)。在引入
CPUID
错误之前,当guest虚拟机在直接执行下运行时,无法拦截guest虚拟机执行CPUID
指令。有些CPU支持有限的能力来覆盖某些CPUID
叶子的结果(在寄存器基础上的寄存器),即使不拦截CPUID
指令也是如此。因此,userCPUID
基于hostCPUID
,但可以覆盖的寄存器具有guestCPUID
值。
答案 1 :(得分:0)
host-passthrough模型旨在向guest虚拟机公开每个主机CPU功能,但此规则有一些例外。如果CPU功能非常新,那么QEMU,KVM和libvirt可能不知道它的存在。默认情况下,KVM是保守的,因此不会暴露任何它不知道的功能。在这种情况下,仅仅编辑cpu_map.xml并没有帮助,因为它只告诉libvirt - 你仍然需要QEMU& KVM知道它需要代码更改。第二种情况是某些CPU功能对于公开客户端是不安全的,因此KVM将明确阻止它们。
您可以使用'virsh capabilities'
查看libvirt认为主机拥有的内容