" /> " />

目 录CONTENT

文章目录

CPU虚拟化分享

Administrator
2024-08-12 / 0 评论 / 0 点赞 / 13 阅读 / 5835 字

什么是CPU虚拟化

CPU 运行的本质行为其实就是从 PC 寄存器所指内存区域中不断取出指令解码执行,我们不难想到的是,实现一个虚拟机最简单粗暴的方法便是通过模拟每一条指令对应的行为,从而使得 VM 的行为对 VMM 而言是完全可控的

虚拟化遇到的问题

  1. 在系统虚拟化的经典架构「Trap & Emulate」中, Guest OS 全部运行在 ring3,当涉及到一些敏感指令时,VM 触发 General Protection 异常,由 VMM 进行截获并处理,但不是所有敏感指令都是特权指令,不是所有的敏感指令都有触发异常以让 VMM 介入的机会, x86 架构中一共有 17 条非特权敏感指令

  2. 每一条指令在执行时都完成了 “陷入”,因此我们可以使用模拟技术解决虚拟化的漏洞,同时还能模拟与物理机不同架构的虚拟机,性能极差,因为每一条指令都需要经过 VMM 的解析后再由 VMM 模拟执行,哪怕最简单的一条指令也可能需要分解成多个步骤与多次内存访问,效率极低。

虚拟化方案

硬件辅助虚拟化

  • VMX Root Operation:Hypervisor 所工作的模式,在这个模式下可以访问计算机的所有资源,并对 VM 进行调度。

  • VMX Non-Root Operation:VM 所工作的模式,在这个模式下仅能访问非敏感资源,对于敏感资源的访问(例如 I/O 操作)会使得 CPU 退出 Non-Root 模式并陷入 Hypervisor 中,由 Hypervisor 处理后再重新进入 Non-Root 模式恢复 VM 的运行。

对 Root 模式与 Non-Root 模式间的切换行为进行定义:

  • VM-Entry:Hypervisor 保存自身状态信息,切换到 VMX Non-Root 模式,载入 VM 状态信息,恢复 VM 执行流。

  • VM-Exit:VM 运行暂停并保存自身状态信息,切换到 VMX Root 模式,载入 Hypervisor 状态信息,执行相应的处理函数

VMCS

VMCSVirtual-Machine Control Structure)是用以保存 CPU 虚拟化所需要的相关状态的一块内存,每个 virtual CPU 对应有一个 VMCS,同一时刻一个物理 CPU 只能与一个 VMCS 绑定,反之亦然,但在不同的时刻我们可以将 VMCS 绑定到不同的物理 CPU 上,称之为 VMCS 的迁移(Migration)

  • VM entry:从 Hypervisor 切换到 VM

  • 检查 VMCS 合法性(各字段值是否合法)。

  • 加载 VMCS 的 Guest-state area 中的各字段到对应的寄存器。

  • 加载指定的 MSR。

  • 设置 VMCS 的状态为 launched

  • 根据需要通过写 VMCS 的 VM-entry Interrucption-Information 向 VM 进行事件注入(如异常、异步中断等)。

  • VM exit:从 VM 切换到 Hypervisor

  • 将 VM 退出的原因与详细信息写入 VMCS 的 VM-exit information fields

  • 将 VM 的寄存器保存至 VMCS 的 Guest-state area

  • 从 VMCS 的 Host-state area 中恢复 Host 寄存器。

  • 加载指定 MSR。

0

评论区