接前一篇文章:
本文内容参考:
《 QEMU /KVM》源码解析与应用 —— 李强,机械工业出版社
从头开始了解和使用Hypervisor(第3部分) - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com
特此致谢!
上一回简要介绍了VMX架构,本回继续对基于硬件CPU虚拟化的VT-x技术进行简要介绍。
一、CPU虚拟化介绍
1. CPU虚拟化简介
2. VMX架构简介
3. VMCS介绍
上一回提到,每一个VM都有一个对应的 虚拟机 控制结构(Virtual Machine Control Structure,VMCS)。每个虚拟机的VCPU都有一个VMCS区域。VMCS用来管理VMX non-root Operation的转换以及控制VCPU的行为。操作VMCS的指令包括VMCLEAR、VMPTRLD、VMREAD和VMWRITE。 VMCS区域的大小为4KB,VMM通过它的64位地址来对该区域进行访问。
VMCS之于VCPU的所用类似于进程描述符之于进程的作用。传统上,操作系统的进程会共享物理CPU资源,操作系统负责在多个进程之间分配CPU,每个进程都有进程描述符来保存进程的信息,并且在进程切换时保存硬件上下文,使得进程能够在下次被调度的时候正常运行。同样,VCPU之间会共享物理CPU,VMM负责在多个VCPU之间分配物理CPU,每个VCPU都有自己的描述符,当VMM在切换VCPU运行时需要保存此刻的VCPU状态,从而在下次的VCPU调度中,使得VCPU能够从被中断的那个点开始正常运行。
VMCS区域的内容如下所示:
在VMCS的格式中,前8个字节是固定的。
- Byte 0~3
VMCS的第一个4字节的第0位到第30位表示修正标识符,用来标识不同的VMCS版本,VMM必须初始化这个值;第一个4字节的第31位是 shadow -VMCS indicator,VMM需要根据VMCS是一个普通的VMCS还是一个shadow VMCS来设置shadow-VMCS indicator。
- Byte 4~7
VMCS的第二个4字节是VMX-abort indicator,当VM Exit发生错误时,会产生VMX-abort,导致处理器进入关闭状态,处理器写入一个非零值到VMX-abort indicator。
剩下的就是VMCS数据区了,它控制着VMX non-root和VMX root之间的转换。这个区域的格式是由实现决定的,VMM通过VMREAD和VMWRITE指令在这里读写。
关于VMCS数据区的详细介绍,请看下回。