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:62State表示中断状态位;00:Invalid:01:Pending;10:Active;11:Pending and active
61HW表示此虚拟中断是否直接映射到硬件中断。0:中断完全由软件触发;1:中断直接映射到硬件中断。当虚拟中断被停用时,一个停用中断请求被发送到分发服务器,使用这个寄存器中的pINTID字段来指示物理中断ID。
60Group表示此虚拟中断的组。 表示是Group0还是Group1中断
59NMI表示虚拟优先级是否具有不可屏蔽属性。 0:虚拟中断没有不可屏蔽中断属性; 1:虚拟中断有不可屏蔽中断属性。
58:56res0保留位
55:48Priority表示该中断的优先级。
47:45res0保留位
44:32pINTID物理中断号,表示硬件中断。
31:0vINTID虚拟中断号,表示虚拟中断

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。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小坚学Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值