ARM系列 -- 虚拟化(二)

上一篇介绍了虚拟化和hypervisor的基本概念。为了配合虚拟化,ARM做了许多工作,首先是定义了四个异常等级(Exception Level,简称EL)。

前面介绍异常和特权的文章中有介绍,此处再啰嗦几句。每个异常级别都有编号,分别是EL0-3,权限级别越高,对应的编号越高。用户程序运行在EL0,操作系统运行在EL1,虚拟机监控程序(hypervisor)运行在EL2,固件程序(firmware)运行在EL3。

这里插一句,在intel的体系中,类似的概念是ring0-3。

在ARM的架构下,系统寄存器在不同的异常等级下是独立的寄存器,在指令集中有自己的编码,并在硬件中单独实现 。这些系统寄存器可以根据后缀区分出可以访问的等级。例如,TTBR0_EL1是保存转换表基址的寄存器。如果EL0访问此寄存器,将会触发一个异常。

在高异常等级下可以访问低异常等级的寄存器,虽然大多数情况下不会这么做。但在某些场景下,还是需要的。比如在上下文切换或电源管理操作期间,更多特权级别有时会访问与较低异常级别关联的寄存器,以实现虚拟化功能或读写寄存器集,作为保存和还原操作的一部分。

除了异常等级,还有两个概念:执行状态(execution state)和安全状态(security state)

ARMv8-A有两种可用的执行状态:

  • AArch32:32位执行状态。此状态下的操作与Armv7-A兼容。有两个可用的指令集:T32和A32。标准寄存器宽度为32位。
  • AArch64:64位执行状态。有一个可用的指令集:A64。标准寄存器宽度为64位。

ARMv8-A架构实现两种安全状态,允许对软件进行进一步的分区,以隔离和划分受信任的软件:

  • 安全状态:在此状态下,处理单元(Processing Element)可以访问安全的和非安全的物理地址空间。在这种状态下,PE可以访问安全和非安全系统寄存器。在这种状态下运行的软件只能响应安全中断。
  • 非安全状态:在此状态下,PE只能访问非安全物理地址空间。PE也只能访问允许非安全访问的系统寄存器。在此状态下运行的软件只能响应非安全中断。

有了以上的概念,我们来看一下AArch64的虚拟化,如下图。图中安全状态的EL2用灰色显示,是因为安全状态的EL2并不总是可用。

说起虚拟化,其实可以分为几大块:

  • CPU虚拟化,
  • 内存虚拟化,
  • IO虚拟化,
  • 中断虚拟化。

CPU虚拟化这里没太多好讲的**,区分虚拟机(VM)和虚拟CPU(vCPU)就好**,方便阅读文档。一个虚拟机里面可能包含一个或多个虚拟CPU。

VM不等同于vCPU,比如,一个内存页面可以被分配一个VM,因此所有属于该VM的所有vCPU都可以访问它。而一个虚拟中断只是针对某个vCPU,因此只有该vCPU可以收到。

在ARM的文档里,关于处理器更为严谨的定义是处理单元(Processing Element,PE),因为CPU可能包含多个内核或线程,而PE用来指代单一的执行单元。

接下来先来看看内存虚拟化。百度百科的定义是这样的,"虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换"。

讲内存虚拟化之前要了解一下虚拟地址(Virtual Address, VA)。在最早期的计算机中,程序是直接访问物理地址(Physical Address)的。如果每次只运行一个程序,这种直接访问物理地址的方式没有问题,但是如果要运行多个程序,就会带来很多问题。

比如,如何防止恶意程序访问为其它程序分配的物理内存,或者如何避免内存碎片等等。**为了解决直接访问物理地址带来的种种问题,人们想出了一个办法,在直接访问物理地址前加上一个间接地址。**这样,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。

这样,只要操作系统管理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,而且可以加上地址保护策略,隔绝程序间互相访问。

为了支持虚拟化,ARMv8-A支持两步地址转换,也就是文档常提到的Stage 2 translation。Stage 2 转换允许hypervisor控制虚拟机(VM)的内存视图。

具体来说,它允许hypervisor控制虚拟机可以访问哪些系统资源,以及这些资源在虚拟机地址空间中的位置。Stage 2转换使得虚拟机只能看到分配给它自己的资源,而看不到分配给其它虚拟机或hypervisor的资源。

操作系统(OS)控制一组地址转换表,负责从虚拟地址空间映射到它认为是物理地址空间的。由hypervisor负责控制第二步地址转换,得到真实的物理地址。

操作系统控制的转换称为阶段1(stage 1)转换管理程序控制的转换称为阶段2(stage 2)转换 。操作系统认为是物理内存的地址空间称为中间物理地址(Intermediate Physical Address,IPA)空间。所以,地址转换的过程是VA->IPA->PA。

每个VM会被分配一个虚拟机标识符(virtual machine identifier,VMID)。VMID用于标记TLB条目,以标识每个条目所属的哪个VM。此标记允许TLB中同时存在多个不同VM的翻译。TLB条目也可以用地址空间标识符(address space identifier,ASID)进行标记。

操作系统为应用程序分配一个ASID,该应用程序中的所有TLB条目都标记有该ASID。这意味着不同应用程序的TLB条目能够在TLB中共存,而不存在一个应用程序使用属于不同应用程序的TLB条目的可能性。每个VM都有自己的ASID命名空间。例如,两个虚拟机可能都使用ASID 5,但它们用于不同的用途。

Stage 1和Stage 2映射都包含属性,如类型和访问权限。内存管理单元(MMU)将两个阶段的属性组合在一起,以给出最终的有效值。MMU通过选择限制性更强的阶段来实现这一点。

下图的例子中,device类型比normal类型更具限制性。因此,最后的类型是device。如果反过来,stage 1= normal,stage 2= device,最后的结果是一样。

这种组合属性的方法适用于大多数用例,但有时hypervisor可能希望覆盖这种行为。例如,在VM的早期启动期间。

VM的IPA地址空间同样被划分成内存与外围设备的区域。VM可以访问实际物理外围设备(通常称为直接分配的外设)和虚拟外设。Hypervisor在软件中完全模拟虚拟外设。


作者:老秦谈芯

来源:https://mp.weixin.qq.com/s/uJM8fs-FiGyGBxHLxUKruQ

相关推荐
GilgameshJSS7 小时前
STM32H743-ARM例程33-TOUCH
c语言·arm开发·stm32·单片机·嵌入式硬件
wanhengidc10 小时前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
陌上花开缓缓归以21 小时前
phy降速自愈到100M重试流程分析
arm开发
凉、介1 天前
ARM 总线技术 —— APB
arm开发·笔记·学习
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
陌上花开缓缓归以2 天前
linux系统启动失败之flash异常分析
arm开发
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的井下AI故障诊断方案——让煤矿远程监控更智能、更精准
网络·arm开发·人工智能·算法·边缘计算
GilgameshJSS3 天前
STM32H743-ARM例程35-DHCP
c语言·arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS3 天前
STM32H743-ARM例程34-BootROM
c语言·arm开发·stm32·单片机·嵌入式硬件
robin8611093 天前
Keil(MDK-ARM)和 STM32CubeIDE对比
arm开发·stm32·嵌入式硬件