-
-
[翻译] 虚拟化是如何工作的(第一部分 虚拟化控制结构)
-
发表于: 2018-12-28 17:52 8135
-
在上一部分,我们讨论了虚拟机的生命周期。
那么,虚拟机的处理器怎样获取客户机配置信息?加载哪些寄存器、中断或CPU指令会导致VM-Exit?
VMM通过调用虚拟化控制结构(VMCS)获取这些信息,它存储着所有配置信息和必须遵守的规则。VMCS的结构是怎样的呢?
MSR
VMCS ID的第31位用于标记它是否为已存在VMCS的自更新副本(对我们不重要)。第32到63位总为0,除非在VM-Exit时出错。
其余部分是真正重要的部分。
还记得吗,虚拟机关闭时,处理器要保存客户机所有寄存器的值和其他一些信息。这些信息都保存在此区域。例如:
这部分用于定义允许客户机处理的内容,以及导致VM-Exit的条件。
(1)中断
中断,即处理器通过硬件或某些软件产生的中断。比如,当长按电源键时,会发送一个中断请求(IRQ)给处理器。CPU在中断描述符表(IDT)中查找该中断请求,并执行该条目指向的指令,启动一个快速关闭程序。其他情况下,还会调用蓝屏等其他程序。
(2)基于处理器的执行控制
设置这些标志位可以标志一些导致VM-Exit的指令。例如:对控制寄存器03和08进行读写,使用I/O指令,读写本地描述符表,运行指令时退出。
注释:不是所有处理器都支持英特尔手册的所有设置列表。比如Xen需要在设置前读取MSR。
(3)其他
你可以定义VMM是否使用位图。什么是位图呢?位图就像位数组,每一位表示一个中断、一个MSR或一条I/O指令。例如,客户机在CPU上运行时发生了一个中断,处理器在位图中查找相同位。如果是1则VM-Exit,如果是0则不是VM-Exit。当客户机使用MSR或I/O指令时,过程也一样。
这部分主要用于定义,VM-Exit时,需要加载和保存哪些寄存器
(主要是MSR和调试寄存器)
这部分用于列出虚拟机启动时需要调用或保存的寄存器。但是在此之上,VMM可以指定中断注入到客户的执行流中,只需在中断描述符表中指定条目。之后处理器会准备该中断必要的寄存器,并在返回到非根模式时执行中断处理程序。
VMCS保存在内存中什么位置,完全取决于处理器(研究人员已经找到在内存中定位VMCS的方法)。所以要读写VMCS,需要调用VMREAD/VMWRITE函数。
再回忆一下这些配置。
在处理器执行客户机代码之前,VMM可以控制客户机的整个环境,包括:寄存器,中断,IO相关东西,以及内存(第二部分讲解)。所以VMM控制所有基础的硬件字符串。Xen、KVM和Hyper-V等管理程序都运行在上面,提供一种更抽象、更简单的方法来控制虚拟机。
这是本系列文章的第一部分,如果有什么问题或者需要了解更多细节,请联系我。
如果你想开发一个基础的管理程序,可以参考链接:https://rayanfam.com/topics/hypervisor-from-scratch-part-1/(此文已由sudozhange翻译,链接:https://bbs.pediy.com/thread-246580.htm)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!