1

我有一个带有Intel E5-26xx v3处理器的 Ubuntu(在 14.04 或 16.04 上试用)KVM 主机。

我需要向来宾 VM 公开某个标志,但 QEMU/libvirt 没有公开它,即使我cpu mode='host-passthrough'在我的 VM libvirt XML 定义中使用了。我相信这是由于此文件/usr/share/libvirt/cpu_map.xml中定义的内容未定义我想要暴露的标志。

所以,我希望能够修改cpu_map.xml和手动添加 CPU 标志定义,但我不知道如何/在哪里可以得到CPUID函数的结果以及它们是否在ebx/ecx等等。任何指针表示赞赏.

免责声明:我没有涉足 CPU 架构,所以我在这方面的知识非常有限。

4

2 回答 2

0

CPUID指令中检索结果非常简单:

  • 检查 EFLAGS 寄存器中的 ID 标志(第 21 位)是否设置,这表明CPUID指令的可用性
  • EAXECX寄存器设置为特定值
  • 称呼CPUID
  • 解释EAXEBXECXEDX寄存器的值

许多网站对结果的解释进行了讨论。其中之一是LowLevel。其中许多仅涵盖可能结果的子集。

一个关于 VM 中 CPUID 细节的线程将这些基本知识扩展到:

UserCPUID是使用二进制翻译时本机运行的来宾Ring-3代码可见的内容。对于二进制翻译,通常只有Ring-0(或 IOPL-3)代码需要进行二进制翻译。大多数Ring-3代码在本地运行(在我们称为“直接执行”的模式下。)

在引入故障之前,当客户机在直接执行下运行时,CPUID无法拦截客户机执行指令。CPUID一些 CPU 支持有限的能力来覆盖一些CPUID叶子的结果(在逐个寄存器的基础上),即使没有拦截CPUID指令。因此,userCPUID基于hostCPUID,但可以覆盖的寄存器具有guestCPUID值。

于 2016-11-18T22:50:27.530 回答
0

主机直通模型旨在向来宾公开每个主机 CPU 功能,但此规则有一些例外。如果 CPU 特性非常新,那么 QEMU、KVM 和 libvirt 可能不知道它的存在。KVM 默认是保守的,因此不会暴露任何它不知道的特性。在这种情况下,仅仅编辑 cpu_map.xml 并没有帮助,因为它只会告诉 libvirt - 你仍然需要 QEMU 和 KVM 来了解它,这需要更改代码。第二种情况是某些 CPU 功能无法安全地暴露给来宾,因此 KVM 会显式阻止它们。

您可以通过使用“virsh 功能”来查看 libvirt 认为主机拥有什么

于 2016-12-15T10:22:02.390 回答