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 往往不够用。