CPU虚拟化

在x86体系架构上,CPU一般有4个特权级别:RING0~RING3,用于给操作系统和应用程序访问硬件。在Linux中,仅使用其中2个特权级别:RING0(内核态)、RING3(用户态)。

关于VMX根模式与VMX非根模式。对于硬件辅助虚拟化而言,为能在不对操作系统做任何修改的前提下使用虚拟机,CPU引入2种运行模式:VMX根模式、VMX非根模式。宿主机运行在根模式下,宿主机内核处于RING0,用户态程序处于RING3。虚拟机运行在非根模式下,虚拟机内核处于RING0,用户态程序处于RING3。

关于VM Exit与VM Entry。处于非根模式的虚拟机,当外部中断或缺页异常,或主动调用VMCALL指令来调用VMM服务时,CPU会从非根模式切换至根模式,整个过程称为VM Exit。相反,当VMM通过显式调用VMLAUNCH或VMRESUME指令切换至非根模式时,硬件自动加载虚拟机上下文,运行虚拟机指令,这一转换称为VM Entry。

如图 1所示:
图 1. 非根模式与根模式


当虚拟机通过VM Exit从非根模式退出至根模式后,KVM会根据退出原因执行进一步操作,若是I/O操作则交由QEMU处理,若是非I/O操作则由KVM自行处理,处理完成后通过VM Entry再次切入非根模式运行。

如图 2所示:
图 2. 模式切换