8.1.2 KVM架构
1.VM entry和VM exit
Guest与VMM之间的切换有两个过程:VM entry和VM exit。Guest运行时处于VMX下的non-root模式,当执行特殊操作的时候(具体哪种操作,后面VM exit的原因中会提到),通过VM exit将CPU控制权返回给VMM,从而陷入root模式下的ring 0内的VMM,进行“陷入模拟”。VMM执行完特殊操作后,再通过VM entry将结果和控制权返回给Guest。
2.导致VM exit的原因
导致VM exit的原因有多种,例如Guest执行了硬件I/O访问操作,或者Guest调用了VMCALL指令,或者调用了退出指令,或者产生了一个Page Fault,或者访问了特殊设备的寄存器等。
3.VMCS(虚拟机控制结构)
这是虚拟机的户口本,对虚拟机至关重要。Guest exit的时候将当前Guest的上下文保存到VMCS中,Guest entry的时候将VMCS上下文恢复给VMM。VMCS是一个64位的指针,指向一个真实的内存地址,VMCS是以vCPU为单位的,即Guest有多少个vCPU,就对应多少个VMCS指针。VMCS的操作包括VMREAD、VMWRITE和VMCLEAR。当Guest执行的指令处于VMX模式(包括运行VMM的root模式和运行Guest代码的non-root模式)时,Guest不能判断当前CPU是否处于VMX模式还是非VMX模式。当产生VM exit的时候,CPU会将exit reason保存到MSRs VMX模式的特殊寄存器组中,对应到KVM就是vCPU→kvm_run→exit_reason。VMM再根据exit_reason进行相应的处理。因此,MSRs寄存器就成了Guest和VMX交接的中间人。VMCS内部架构如图8-1所示。
图8-1 VMCS内部架构