各种虚拟化对比
虚拟化种类 | 优缺点 | 实现 |
---|---|---|
硬件加速虚拟化 | 性能最好,最贵 | 1.vcpu 2.内存stage2 3.虚拟中断 4.arch time |
全虚拟化 | 纯软件实现,性能差 | 1.qemu串口 2.qemu磁盘 |
半虚拟化 | 软件实现复杂 | 1.Virtio block 设备 2.Virtio net 设备 |
io虚拟化加速 | 移植性差 | 1.PCI设备透传 2.AMBA设备透传 |
Arm64在硬件上提供了两种机制来发起virtual IRQ:
a.通过GIC中断控制器中断转发(通过LR寄存器)
b.通过CPU EL2的hypervisor 配置寄存器HCR_EL2.VI
通过GIC中断控制器中断转发,其中断在虚拟化的路由步骤:
1.外设中断输入源到达GIC
2.GIC向CPU发送一个物理中断信号
3.CPU会切换到EL2,然后HYPERVISOR通过PHYSICAL CPU INTERFACE获取中断的信息
4.然后HYPERVISOR 通过HYPERVISOR INTERFACE的LR寄存器写入对应虚拟中断的状态(PENDING)
5.VIRTUAL CPU INTERFACE 根据这个PENDING会向CPU发送一个VIRTUAL IRQ(因为提前配置ICH_LR 寄存器绑定物理中断号和虚拟中断号)
6.虚拟机被调度,虚拟机所在的CPU会获取这个VIRTUAL IRQ造成的中断异常
7.GUESTOS通过VIRTUAL CPU INTERFACE获取VIRTUAL IRQ的信息并处理
不通过GIC中断控制器中断转发,其中断在虚拟化的路由步骤:
1.THE GUEST OS 在 EL1 执行或者 GUEST OS 用户态 APP在 EL0 执行
2.外设中断到达 GIC, 并通过 PHYSICAL CPUINTERFACE 发送一个物理中断到 CPU。
3.CPU 会 TRAP 到 EL2, HYPERVISOR 通过 GIC_IAR1 响应中断,并获取中断的状态信息 (ID, 优先级 )
4.EL2 IRQ HANDLER 判断该中断是 HYPERVISOR 自己处理还是同虚拟中断注入虚拟机处理
5.HYPERVISOR 通过 HCR_EL2.VI 向虚拟机注入一个虚拟中断,没有使用 GIC LIST REGISTER
6.CPU 退出 HYPERVISOR 返回虚拟机所在的 EL1 或 EL0
7.因为 EL1 的 PSTATE.I 没被屏蔽 ,HCR_EL2.VI 将会触发一个虚拟中断异常,然后被 GUESTOS 的 IRQ HANDLER 处理
ICH_LR_EL2, Interrupt Controller List Registers, n = 0 - 15
位数 | 名称 | 含义 |
---|---|---|
63:62 | State | 表示中断状态位;00:Invalid:01:Pending;10:Active;11:Pending and active |
61 | HW | 表示此虚拟中断是否直接映射到硬件中断。0:中断完全由软件触发;1:中断直接映射到硬件中断。当虚拟中断被停用时,一个停用中断请求被发送到分发服务器,使用这个寄存器中的pINTID字段来指示物理中断ID。 |
60 | Group | 表示此虚拟中断的组。 表示是Group0还是Group1中断 |
59 | NMI | 表示虚拟优先级是否具有不可屏蔽属性。 0:虚拟中断没有不可屏蔽中断属性; 1:虚拟中断有不可屏蔽中断属性。 |
58:56 | res0 | 保留位 |
55:48 | Priority | 表示该中断的优先级。 |
47:45 | res0 | 保留位 |
44:32 | pINTID | 物理中断号,表示硬件中断。 |
31:0 | vINTID | 虚拟中断号,表示虚拟中断 |
ZVM虚拟化:
• CPU 虚拟化:CPU 虚拟化模块的主要功能是为每个 Guest OS 的 vCPU 虚拟出一个单独的隔离上下文。每个 vCPU 均作为一个线程存在,由 ZVM 统一调度。为了提高 vCPU 的性能,Arm64 架构为 ZVM 提供了 VHE 支持,VHE 可以使 HostOS 迁移到 EL2 特权模式,而无需改变操作系统原有代码。VHE 主要实现了 Arm 寄存器重定向,可以在不修改 Zephyr RTOS 内核代码的情况下,将其迁移 EL2 层开发 ZVM,既降低了系统冗余,又提高了系统性能。
• 内存虚拟化:内存虚拟化模块的主要作用是实现 Guest OS 间内存地址的隔离。系统需要隔离不同 Guest OS 的内存空间,监控 Guest OS 对实际物理内存的访问,以保护物理内存。为了实现该功能,Arm64 提供了两阶段的地址查找策。第一阶段是从 Guest OS 的虚拟地址到 Guest OS 的物理地址转换,第二阶段是从 Guest OS 的物理地址到 Host OS 的物理地址转化。Arm 专门为第二阶段转换提供单独的硬件,以提高地址翻译性能。
• 中断虚拟化模块:中断虚拟化使用 Arm 的通用中断控制器(GIC)设备,并基于该设备实现虚拟中断配置。Guest OS 的中断统一路由到 ZVM,然后 ZVM 会将它们分配给不同的 vCPU。虚拟中断的注入通过 GIC 中的 Virtual CPU 接口或 ListRegister 具体实现。
• 定时器虚拟化:定时器虚拟化为每个 CPU 定义了一组虚拟定时器寄存器,它们在预定时间后单独计数并抛出中断,由Host OS 转发给 Guest OS。同时,在 Guest OS 切换过程中,虚拟定时器会计算 Guest OS 的实际运行时间,并对 GuestOS 退出的时间进行补偿,为 Guest OS 提供定时器服务。
• 设备虚拟化:在设备虚拟化方面,ZVM 采用 Arm 中的 Memory-Mapped I/O (MMIO) 方法将设备地址映射到虚拟内存地址,构建虚拟设备空间,实现 Guest OS 对设备地址的访问。在具体实现上,ZVM 统一构建一个虚拟的 MMIO 设备,在Guest OS 创建过程中将该设备分配给指定的 Guest OS,实现 I/O 虚拟化。此外,对一些非独占设备,ZVM 使用设备直通的方式实现设备的访问。
中断控制器分类:
ICC__ELn(物理 cpu interface 系统寄存器):Host OS使用ICC__ELn处理常规的物理中断,这包括打开和关闭PE的中断处理能力,ack中断,为PE维护一个中断优先级掩码(只响应更高优先级中断),定义中断抢占策略,执行中断降级。
ICH__EL2(虚拟 cpu interface 控制系统寄存器):Hypervisor使用ICH__EL2控制virtual CPU interface,这包括打开和关闭virtual CPU interface,读写virtual CPU interface中的寄存器以实现vCPU的调度和上下文切换,配置maintenance中断,控制虚拟中断。
ICV__ELn(虚拟 cpu interface 系统寄存器):Guest OS里也能访问CPU interface,只不过它被映射到virtual CPU interface,我们可以将其视为physical CPU interface的shadow,它们具有完全一样的格式和功能。virtual CPU interface绑定到一个vPE,而vPE与PE的区别在于vPE是一个可被调度的软件线程。因此当vPE被调度走而不再运行时应该将virtual CPU interface的状态保存在内存中,而当vPE被调度再次运行时应该将内存中的状态恢复至virtual CPU interface。