2016-11-18 33 views
1

我有一台Ubuntu(尝试14.04或16.04)KVM主机与英特尔E5-26xx v3处理器。手动将CPU标志暴露给访客虚拟机进行测试

有一个特定的标志,我需要公开虚拟机,但QEMU/libvirt没有公开,即使我在我的VM libvirt XML定义中使用cpu mode='host-passthrough'。我相信这是由于在此文件/usr/share/libvirt/cpu_map.xml中定义的内容,我喜欢暴露的标志未定义。

所以,我希望能够修改cpu_map.xml和手动添加CPU标志的定义,但我还不能肯定如何/我在哪里可以得到CPUID功能的结果,无论他们是在ebx/ecx等任何指针赞赏。

声明:我没有插手CPU架构,所以我的知识在这方面非常有限。

回答

0

检索从CPUID instruction结果是相当简单:

  • 检查在EFLAGS寄存器中的ID标志(位21)被设置时,其指示CPUID指令
  • 的可用性设置EAXECX寄存器某些值
  • 呼叫CPUID
  • 解释的EAXEBX,的值和EDX寄存器

许多网站convering结果的解释。其中之一是LowLevel。其中许多只涵盖了可能结果的一个子集。

A thread on the specifics of CPUID in VMs扩展了这个基本知识:

UserCPUID是什么将是可见的来宾环3代码中使用的二进制转换时,本机运行。对于二进制翻译,通常只有Ring-0(或IOPL-3)代码受二进制翻译。大多数环3代码在本地运行(在模式我们称之为“直接执行”。)

推出之前CPUID断裂的,没有办法拦截CPUID指令的客户执行当客人正在直接执行下运行。即使没有拦截CPUID指令,一些CPU支持有限的能力来覆盖某些CPUID树叶的结果(以寄存器为基础)。因此,userCPUID基于hostCPUID,但可以覆盖的寄存器具有guestCPUID值。

0

主机直通模式的目标是向访客发布每个主机CPU功能,但该规则有一些例外情况。如果CPU功能非常新,那么QEMU,KVM和libvirt可能不知道它的存在。 KVM默认保守,因此不会公开任何它不知道的功能。在这种情况下,只需编辑cpu_map。xml不会帮助,因为它只会告诉libvirt它 - 你仍然需要QEMU & KVM才能知道它需要更改代码。第二种情况是某些CPU功能对于访客不安全,因此KVM会明确阻止它们。

你可以看到libvirt相信主机使用'virsh功能'