各种虚拟化对比
虚拟化种类 | 优缺点 | 实现 |
---|---|---|
硬件加速虚拟化 | 性能最好,最贵 | 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 | 虚拟中断号,表示虚拟中断 |
中断控制器分类:
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。