qemu64 是 qemu 的默认兼容性 CPU 模型,指令集很基础。但查看它的定义,居然包含 svm 这类虚拟化指令,这背后是 TCG 与 KVM 两种支持场景的差异。

现象

查看 qemu64 CPU 模型定义:

cat /usr/share/libvirt/cpu_map/x86_qemu64.xml
<cpus>
  <model name='qemu64'>
    <decode host='on' guest='on'/>
    <!-- These are supported only by TCG.  KVM supports them only if the
         host does.  So we leave them out:

    <feature name='abm'/>
    <feature name='lahf_lm'/>
    <feature name='popcnt'/>
    <feature name='sse4a'/>
    -->
    <feature name='apic'/>
    <feature name='clflush'/>
    <feature name='cmov'/>
    <feature name='cx16'/>
    <feature name='cx8'/>
    <feature name='de'/>
    <feature name='fpu'/>
    <feature name='fxsr'/>
    <feature name='lm'/>
    <feature name='mca'/>
    <feature name='mce'/>
    <feature name='mmx'/>
    <feature name='msr'/>
    <feature name='mtrr'/>
    <feature name='nx'/>
    <feature name='pae'/>
    <feature name='pat'/>
    <feature name='pge'/>
    <feature name='pni'/>
    <feature name='pse'/>
    <feature name='pse36'/>
    <feature name='sep'/>
    <feature name='sse'/>
    <feature name='sse2'/>
    <feature name='svm'/>
    <feature name='syscall'/>
    <feature name='tsc'/>
  </model>
</cpus>

分析

qemu64 是 qemu 为了兼容性提供的默认 CPU 模型,指令集非常基础。 但有意思的是,它居然包含了 svm(AMD 的虚拟化扩展指令)。

注释里也说明了:abm、lahf_lm、popcnt、sse4a 这些指令只被 TCG 支持,KVM 只有在宿主 CPU 支持时才支持,所以被排除在外。

而 svm 之所以保留,是因为它作为虚拟化指令,在 KVM 场景下由宿主 CPU 提供,qemu64 模型里声明它并不会影响兼容性。

小结

  • qemu64 是 qemu 的默认兼容性 CPU 模型,指令集很基础;
  • 它包含 svm 等虚拟化指令,但排除了 abm、popcnt、sse4a 等只被 TCG 支持的指令;
  • 理解 CPU 模型,要区分"TCG 支持"和"KVM 支持"两种场景;
  • 现代操作系统需要较新的指令集(如 x86-64-v2),默认 qemu64 往往不够用。