看操作系统虚拟化原理总结篇——VMCS详解
1.VMCS的组成
该内存区域分为三个部分:其中第一个部分位于偏移0位(对应版本标识),第二个部分位于偏移4位(对应中止指示),第三个区域的属性是我们关注的重点;其中第三区域的属性是我们关注的重点;该数据域被存储在内存中
2,为什么要引入VMCS
这一现象主要归因于Intel VT-x机制的作用,在此过程中主要由中央处理器执行相关操作,并持续记录VCPU相关寄存器的状态及其相关信息。另一种理解方式是将物理处理器与虚拟化硬件之间的数据传输关系进行分析:物理处理器通过其虚拟机管理单元(VMCS)获取所有虚拟处理器的状态信息;此外,Intel VT-x还提供了一系列指令让物理处理器可以直接访问相应的虚拟机管理单元(VMCS)。
3,VMCS数据域的详细分析:
涉及六个关键领域:客户端状态字段、主机状态字段、虚拟机启动控制字段、虚拟机运行控制字段、虚拟机退出控制字段以及虚拟机退出信息字段。
下面逐一分析:
客户机状态域**,** 用户将CPU的状态存储在非根模式下, 当虚拟机启动时,CPU会自动地从VMM的根模式转移到非根模式, 将客户机的状态转移过去.
当发生VM_Exit的时候 ,CPU自动将CPU的状态保存回客户机状态域。
直观地讲,在计算机体系结构中客户机状态域(CPUI)即为VCPU运行时所处的状态数值描述这一概念较为基础且重要;当程序退出时系统通常会执行存储操作以释放资源;而程序重新启动则需从内存加载相应的指令与数据以便继续执行;此外这些状态信息在代码层面的表示方式也十分关键它们由特定类型的寄存器如CR0 CS SS DS等来存储并传递相关运算信息
主要涉及的领域是宿主机状态域, 掌握前一阶段客户的运行状况能够帮助我们更好地进行后续操作,这样处理起来就方便多了。值得注意的是,当发生退出事件时会被恢复,但进入事件时无需进行存储操作,因为宿主机的状态通常无需更改。
VM_E****ntry 控制域即CPU由根模式过渡至非根模式。在VMM发起之前需预先配置好VMCS的相关参数内容,并触发VM_entry指令以完成任务流程。此时VMM可通过动态更新VMCS中的相关参数设置为向客户机注入虚拟中断信号
VM_Exit控制域, 指的是CPU从非根模式转换为根模式的过程, 即从PCB模式转变为VMM模式. 那么, 什么情况下会导致这种转换发生呢? 涉及之前的敏感指令, 中断等事件, 或者对IO操作进行干预的情况都会引发这种转换.
VM_EXECUTION控制域负责调节VCPU运行时的一系列操作。 该域的设置将影响当执行特定敏感指令时是否会触发系统退出状态。具体而言,该域的取值主要由VMM在处理相关敏感指令时所采用的虚拟化策略决定.
2.2. KVM实现
作为虚拟机器管理机制(VMM),KVM被划分为两个部分:分别运行在Kernel态下的KVM内核模块以及User态下的QEMU模块。其中Kernel态与User态的实际指的就是 VMX 根态下的 特权级 0 和 特权级 3。此外,在 Guest 模式的定义上
基于VT-x技术的支持下,在KVM架构中为每个虚拟机配置多颗虚拟处理器(即VCPU),每颗VCPU均绑定到独立的一个QEMU进程(即Qemu线程)。该过程包括:创建新虚拟处理器(即创建新VCPU)、启动(即初始化)、运行一段时间以及完成退出处理等四个阶段。这些操作均在对应的QEMU进程所处的逻辑上下文中执行;同时需要Kernel态、User态及Guest态三者之间相互配合才能完成任务(如图2.1所示)。此外,在此架构中,QEMU进程与KVM内核模块之间的通信主要采用ioctl命令实现;而当客户程序需要扩展功能时,通常会通过触发VM Exit事件进入主逻辑流程;当客户退出时,则会触发VM entry事件返回至初始状态以完成整个流程的闭环管理
Qemu线程通过ioctl指令向KVM内核模块发出指令,负责处理VCPU的生成与启动等操作。具体而言,在VMM(虚拟机器管理)的作用下,VCPU运行所需的各类必要数据结构被系统性地生成并完成初始化工作。最为关键的就是VMCS这一核心组件,在其配置信息的基础上完成相关设置,请参见附录2中的相关内容。
初始化工作完成后,Qemu 线程通过 ioctl 方式向 KVM 内核模块发出启动 guest 处理器的指令,该模块执行 VM entry 操作,将处理器从 kernel 模式切换至 guest 模式,从而终止主主机服务并开始运行客户软件.值得注意的是,在 KVM 线程处理 ioctl 调用时,宿主机服务仍处于 guest 模式.当客户软件在运行过程中发生异常或中断等事件,或需执行 I/O 操作时,可能导致 VM exit 事件的发生.当 VM exit 是由于 I/O 操作引发时,KVM 内核模块会返回系统调用并将其交由处于 user 模式的 QEMU 线程处理,I/O 事务完成后,QEMU 会再次发送 ioctl 信号指示 KVM 将处理器切换回 guest 模式以恢复客户软件运行;若 VM exit 原因非 I/O 类型,则由 KVM 内核自行处理后将处理器切换回 kernel 模式以恢复客户机状态.
