QEMU/KVM为客户机提供一套完整的硬件系统环境,在客户机看来其所拥有的CPU即是vCPU(virtual CPU)。在KVM环境中,每个客户机都是一个标准的Linux进程(QEMU进程),而每一个vCPU在宿主机中是QEMU进程派生的一个普通线程。

在普通的Linux系统中,进程一般有两种执行模式:内核模式和用户模式。而在KVM环境中,增加了第三种模式:客户模式。vCPU在三种执行模式下的不同分工如下:
(1)用户模式(User Mode)
主要处理I/O的模拟和管理,由QEMU的代码实现。
(2)内核模式(Kernel Mode)
主要处理特别需要高性能和安全相关的指令,如处理客户模式到内核模式的转换,处理客户模式下的I/O指令或其他特权指令引起的退出(VM-Exit),处理影子内在管理(shadow MMU)。
(3)客户模式(Guest Mode)
主要执行Guest中的大部分指令,I/O和一些特权指令除外(它们会引起VM-Exit,被hypervisor截获并模拟)。

vCPU在KVM中的这三种执行模式下的转换:

虚拟化 模拟cpu cpu虚拟模式_硬件平台

在KVM环境中,整个系统的基本架构如下所示:

虚拟化 模拟cpu cpu虚拟模式_默认值_02

在系统的底层CPU硬件中需要有硬件辅助虚拟化技术的支持(Intel VT或ADM-V等),宿主机就运行在硬件之上,KVM的内核部分是作为可动态加载内核模块运行在宿主机中的,其中一个模块是和硬件平台无关的实现虚拟化核心基础架构的kvm模块,另一个是硬件平台相关的kvm_intel(或kvm_amd)模块。而KVM中的一个客户机是作为一个用户空间进程(qemu)运行的,不过它由KVM模块的控制,可以在前面介绍的三种执行模式下运行。多个客户机就是宿主机中的多个QEMU进程,而一个客户机的多个vCPU就是一个QEMU进程中的多个线程。

在qemu-kvm命令行中,“-smp”参数是为了配置客户机的SMP系统,其具体参数如下:

-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]

(1)n用于设置客户机中使用的逻辑CPU数量(默认值是1)。
(2)maxcpus用于设置客户机中最大可能被使用的CPU数量,包括启动时处于下线状态的CPU数量。
(3)cores用于设置每个CPU socket上的core数量(默认值是1)。
(4)threads用于设置每个CPU core上的线程数(默认值是1)。
(5)sockets用于设置客户机中看到的总的CPU socket数量。