1.ARM虚拟化文档提到,guest os运行在Vcpu上,那么实际guest os的指令是如何发送到物理CPU的?hypervisor需要实际记录VCPU状态吗?
--大多数情况下,Guest OS 的非特权指令可以直接在物理 CPU 上运行,而特权指令或敏感操作会被 Hypervisor 拦截和处理。
VCPU 的概念:vCPU是Hypervisor 为 Guest OS 创建的虚拟处理器,Hypervisor为每个vCPU维护一个vCPU数据结构,模拟物理 CPU 的状态。Hypervisor 会将 VCPU 映射到物理 CPU 上进行执行,通过调度算法决定哪个 VCPU 在哪个物理 CPU 核心上运行。在多核心系统中,多个 VCPU 可以并行地在不同的物理核心上执行。
- 直接在物理 CPU 执行:
当 Guest OS 执行普通指令(如算术运算、内存访问)时,Hypervisor 通过配置HCR_EL2寄存器,允许这些指令直接在物理 CPU 的EL0/EL1运行。
- 无需 Hypervisor 干预:
物理 CPU 直接处理这些指令,性能接近原生系统。
- 触发异常到 EL2:
当 Guest OS 执行特权指令(如访问物理寄存器、系统控制指令)或敏感操作(如 WFI 指令在 TWI=1 时),物理 CPU 会检测到异常并跳转到EL2(Hypervisor)。
- Hypervisor 拦截处理:
Hypervisor 通过异常处理程序模拟这些指令的行为,例如:
- 对物理寄存器的访问转换为对 VCPU 虚拟寄存器的操作。
- 处理中断请求(如将虚拟中断映射到物理中断)。
- 处理低功耗指令(如前所述的 WFI 转换)。
| 指令类型 | 执行方式 | Hypervisor 角色 |
| 非特权指令 |
直接在物理 CPU 执行(EL0/EL1) |
无干预 |
| 特权 / 敏感指令 |
触发异常到 EL2,由 Hypervisor 模拟执行 |
拦截并处理指令 |
| 中断处理 |
物理 CPU 响应中断,Hypervisor 注入虚拟中断 |
管理中断路由和上下文切换 |
2.For example, executing a Wait For Interrupt (WFI) instruction usually puts the CPU into a low power state. By asserting the TWI bit, if HCR_EL2.TWI==1, then executing WFI at EL0 or EL1 will instead cause an exception to EL2.
--当HCR_EL2.TWI(Translation of WFI Instructions)位被置 1时:
- EL0 或 EL1(Guest OS 运行的异常级别)执行的 WFI 指令会被转换为异常,直接跳转到EL2(Hypervisor 运行的异常级别)。
- 此时,WFI 指令不再使 CPU 进入低功耗状态,而是触发一次同步异常(Exception 级别 3,类型为
SError或SVC,具体取决于实现)。
VCPU 的上下文状态主要包括寄存器的值(如通用寄存器、程序计数器 PC、栈指针 SP、状态寄存器等)、内存映射信息、中断状态等。这些状态信息描述了 VCPU 在某一时刻的运行状态。
- 时机:当 Hypervisor 需要暂停某个 VCPU 的执行,例如进行上下文切换(调度到其他 VCPU 执行)或者处理异常时,会将当前 VCPU 的上下文状态保存起来。
- 实现方式:Hypervisor 通常会在内存中为每个 VCPU 分配一块特定的区域,用于存储其上下文状态。例如,当发生异常从 EL0/EL1(Guest OS 运行级别)切换到 EL2(Hypervisor 运行级别)时,Hypervisor 会将 EL0/EL1 的寄存器值保存到对应的 VCPU 上下文区域中。这可以通过汇编指令来完成,将寄存器的值依次存储到内存指定的地址。
- 时机:当 Hypervisor 决定恢复某个 VCPU 的执行时,会从之前保存的上下文区域中读取相应的状态信息,并将其恢复到物理 CPU 的寄存器中。
- 实现方式:同样使用汇编指令,将保存在内存中的寄存器值依次加载到物理 CPU 的寄存器中,使得 VCPU 能够从之前暂停的位置继续执行。