课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了软件开发虚拟化服务的一些基础知识,而今天我们就再从硬件处理角度分析一下VMCS的数据结构处理方法。
每个虚拟处理器需将VMCS与内存中的一块区域联合起来,此区域称为VMCS区域。对VMCS区域的操纵是通过VMCS指针来实现的,这个指针是一个指向VMCS的64位的地址值。VMCS区域是一个大不超过4KB的内存块,且需4KB对齐。
VMCS区域分为三个部分:偏移0起是VMCS版本标识,通过不同的版本号,CPU可维护不同的VMCS数据格式;偏移4起是VMX中止指示器,在VMX中止发生时,CPU会在此处存入中止的原因;偏移8起是VMCS数据区,这一部分控制VMX非根操作及VMX切换。
VMCS的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit产生后,处理器把执行权交给VMM以完成控制,然后VMM通过指令触发VMEntry返回原来的虚拟机或调度到另一个虚拟机。
VMCS的数据结构中,每个虚拟机一个,加上虚拟机的各种状态信息,共由3个部分组成,如之前的VMCS架构图所示:
1)、Gueststate:该区域保存了虚拟机运行时的状态,在VMEntry时由处理器装载;在VMExit时由处理器保存。它又由两部分组成:
GuestOS寄存器状态。它包括控制寄存器、调试寄存器、段寄存器等各类寄存器的值。
GuestOS非寄存器状态。用它可以记录当前处理器所处状态,是活跃、停机(HLT)、关机(Shutdown)还是等待启动处理器间中断(Startup-IPI)。
2)、Hoststate:该区域保存了VMM运行时的状态,主要是一些寄存器值,在VMExit时由处理器装载。
3)、Controldata:该区域包含几部分数据信息,分别是:
虚拟机执行控制域(VM-Executioncontrolfields)。VMM主要通过配置该区域来控制虚拟机在非根环境中的执行行为。基于针脚的虚拟机执行控制。它决定在发生外部中断或不可屏蔽中断(NMI)要不要发生VMExit。基于处理器的虚拟机执行控制。它决定虚拟机执行RDTSC、HLT、INVLPG等指令时要不要发生VMExit。
VMExit控制域(VMExitcontrolfields)。该区域控制VMExit时的行为。当VMExit发生后处理器是否处于64位模式;当因为外部中断发生VMExit时,处理器是否响应中断控制器并且获得中断向量号。VMM可以用它来定制当VMExit发生时要保存哪些MSR并且装载哪些MSR。MSR是CPU的模式寄存器,设置CPU的工作环境和标识cpu的工作状态。
VMEntry控制域(VMEntrycontrolfields)。该区域控制VMEntry时的行为。它决定处理器VMEntry后是否处于IA-32e模式。与VMExit的MSR控制类似,VMM用它来定制当VMEntry发生时要装载哪些MSR。VMM可以配置VMEntry时通过虚拟机的IDT向其发送一个事件。在此可以配置将使用IDT的向量、中断类型(硬件或软件中断)、错误码等。
VMExit信息域(VMExitinformationfields)。该只读区域包括近一次发生的VMExit信息。试图对该区域执行写操作将产生错误。。此处存放VMExit的原因以及针对不同原因的更多描述信息、中断或异常向量号、中断类型和错误码、通过IDT发送事件时产生的VMExit信息、指令执行时产生的VMExit信息。
有了VMCS结构后,对虚拟机的控制就是读写VMCS结构。后面对vCPU设置中断,检查状态实际上是在读写VMCS数据结构。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。