手动将CPU标志暴露给来宾VM以进行测试

时间:2016-11-18 19:04:11

标签: cpu qemu libvirt cpuid

我有一台带有 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架构,所以我的知识在这方面非常有限。

2 个答案:

答案 0 :(得分:0)

CPUID instruction检索结果非常简单:

  • 检查EFLAGS寄存器中的ID标志(位21)是否已设置,表示CPUID指令的可用性
  • EAXECX个寄存器设置为特定值
  • 致电CPUID
  • 解释EAXEBXECXEDX个寄存器的值

许多网站汇总了对结果的解释。其中一个是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认为主机拥有的内容