arm64虚拟化学习笔记

各种虚拟化对比

虚拟化种类 优缺点 实现
硬件加速虚拟化 性能最好,最贵 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。

你可能感兴趣的:(Linux,kernel,学习,单片机,嵌入式硬件)