场景

虚拟机的hyperisor很多时候会因为load balance的原因对vCPU进行调度,即从一个物理CPU迁移到另一个物理CPU。

在这个时候,一般来说需要做这么几个步骤:

  • De-schedule VCPU from source CPU
  • Migrate VMCS
    • VMCLEAR in source CPU
    • VMPTRLD in target CPU
  • Schedule VCPU in target CPU by VMLAUNCH (not VMRESUME)

这篇文章讲述一下关于VMCS的一些状态变化。

参考Intel开发者手册 64-ia-32-architectures-software-developer-vol-3b-part-2-manual - volum3: virtual machine contril structures

OVERVIEW

几个要点:
  • 一个vCPU对应一个VMCS
  • 与VMCS相关的指令有:VMLAUNCH, VMREAD, VMRESUME, VMWRITE, VMCLEAR, VMPTRLD等
  • VMCS的状态一共有三个,分别是
    • active or inactive
    • current or not current
    • launched or clear
关于active和current
  • 一个物理CPU会同时维护一些VMCS,可以有多个VMCS的状态是active,但只可能有一个VMCS的状态是current
  • 当某一个物理CPU对某一个VMCS执行了VMPTRLD指令之后,该VMCS的状态变成active以及current。其他VMCS的active状态不会改变,但如果已经有别的VMCS的状态是current,则会变成not current。
  • 执行完VMCLEAR,该VMCS变成inactive以及not current。如果原先这个VMCS是唯一的current,那么这条指令之后没有任何current状态的VMCS存在。
关于launched
  • 如果状态是clear,VM-entry的时候必须使用VMLAUNCH
  • 如果状态是launched,VM-entry的时候使用VMRESUME
  • clear状态通过VMLAUNCH之后变成了launched
  • launched状态通过VMCLEAR之后变成了clear
  • There are no other ways to modify the launch state of a VMCS (it cannot be modified using VMWRITE) and there is no direct way to discover it (it cannot be read using VMREAD).
状态变化

图中的是VMCS-x的状态变化情况。


END