首页
社区
课程
招聘
[翻译] 虚拟化是如何工作的(第一部分 虚拟化控制结构)
2018-12-28 17:52 7609

[翻译] 虚拟化是如何工作的(第一部分 虚拟化控制结构)

2018-12-28 17:52
7609

免责声明
我并不是这个领域的专家,是通过大量的研究完成这篇文章。写这篇的目的仅仅是“理解虚拟化是怎样工作的,然后分享给大家”。如果您在阅读中发现任何问题请告诉我,我会尽快改正。


在上一部分,我们讨论了虚拟机的生命周期。

那么,虚拟机的处理器怎样获取客户机配置信息?加载哪些寄存器、中断或CPU指令会导致VM-Exit?

VMM通过调用虚拟化控制结构(VMCS)获取这些信息,它存储着所有配置信息和必须遵守的规则。VMCS的结构是怎样的呢?


第一部分非常明显,是VMCS的ID,占31位。每个客户机有自己的VMCS,所以不同的客户机可能有不同的规则集。尽管这个ID看起来像一个内存地址,其实不是。当读取CPU的MSR寄存器时,处理器会返回这个ID。


MSR

VMCS ID的第31位用于标记它是否为已存在VMCS的自更新副本(对我们不重要)。第32到63位总为0,除非在VM-Exit时出错。

其余部分是真正重要的部分。

客户机状态域(guest-state area)

还记得吗,虚拟机关闭时,处理器要保存客户机所有寄存器的值和其他一些信息。这些信息都保存在此区域。例如:

  • SP,IP,RF
  • 控制寄存器(CR0—CR4)
  • 段寄存器,基地址,段长,属性(CS,SS,DS等)
  • GDT寄存器,IDT寄存器,基地址
  • 一些MSR寄存器的值
  • 处理器状态(比如:活跃的,中断的)
  • PDPTE(将会在第三部分讲解)
  • 其他

宿主机状态域(host state area)

发生VM-Entry时,用于保存宿主机寄存器的信息。宿主机寄存器的种类与客户机寄存器差不多。

虚拟机执行控制域(VM-execution control area)

这部分用于定义允许客户机处理的内容,以及导致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行为控制域(VM-Exit controls)

这部分主要用于定义,VM-Exit时,需要加载和保存哪些寄存器

(主要是MSR和调试寄存器)

VM Entry行为控制域(VM-Entry controls)

这部分用于列出虚拟机启动时需要调用或保存的寄存器。但是在此之上,VMM可以指定中断注入到客户的执行流中,只需在中断描述符表中指定条目。之后处理器会准备该中断必要的寄存器,并在返回到非根模式时执行中断处理程序。

VM Exit相关信息域(VM-Exit information field)

VMM怎样知道VM-Exit的原因呢?处理器在这部分设置相关位,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) 


翻译:Green奇

校对:sudozhange

原文链接:https://0x00sec.org/t/the-vmcs-part-1/8739




[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回