本篇将继续带大家了解arm虚拟化的相关内容。
介绍了虚拟化和hypervisor的基本概念。为了配合虚拟化,arm做了许多工作,首先是定义了四个异常等级(exception level,简称el)。前面介绍异常和特权的文章中有介绍,此处再啰嗦几句。每个异常级别都有编号,分别是el0-3,权限级别越高,对应的编号越高。用户程序运行在el0,操作系统运行在el1,虚拟机监控程序(hypervisor)运行在el2,固件程序(firmware)运行在el3。这里插一句,在intel的体系中,类似的概念是ring0-3。
图1
在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并不总是可用。
图2
说起虚拟化,其实可以分为几大块:cpu虚拟化,内存虚拟化,io虚拟化,中断虚拟化。cpu虚拟化这里没太多好讲的,区分虚拟机(vm)和虚拟cpu(vcpu)就好,方便阅读文档。一个虚拟机里面可能包含一个或多个虚拟cpu。vm不等同于vcpu,比如,一个内存页面可以被分配一个vm,因此所有属于该vm的所有vcpu都可以访问它。而一个虚拟中断只是针对某个vcpu,因此只有该vcpu可以收到。在arm的文档里,关于处理器更为严谨的定义是处理单元(processing element,pe),因为cpu可能包含多个内核或线程,而pe用来指代单一的执行单元。
图3
接下来先来看看内存虚拟化。百度百科的定义是这样的,“虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换”。讲内存虚拟化之前要了解一下虚拟地址(virtual address,va)。在最早期的计算机中,程序是直接访问物理地址(physical address)的。如果每次只运行一个程序,这种直接访问物理地址的方式没有问题,但是如果要运行多个程序,就会带来很多问题。比如,如何防止恶意程序访问为其它程序分配的物理内存,或者如何避免内存碎片等等。为了解决直接访问物理地址带来的种种问题,人们想出了一个办法,在直接访问物理地址前加上一个间接地址。这样,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统管理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,而且可以加上地址保护策略,隔绝程序间互相访问。
为了支持虚拟化,armv8-a支持两步地址转换,也就是文档常提到的stage2translation。stage2转换允许hypervisor控制虚拟机(vm)的内存视图。具体来说,它允许hypervisor控制虚拟机可以访问哪些系统资源,以及这些资源在虚拟机地址空间中的位置。stage2转换使得虚拟机只能看到分配给它自己的资源,而看不到分配给其它虚拟机或hypervisor的资源。
图4
操作系统(os)控制一组地址转换表,负责从虚拟地址空间映射到它认为是物理地址空间的。由hypervisor负责控制第二步地址转换,得到真实的物理地址。
操作系统控制的转换称为阶段1(stage1)转换,管理程序控制的转换称为阶段2(stage2)转换。操作系统认为是物理内存的地址空间称为中间物理地址(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,但它们用于不同的用途。
stage1和stage2映射都包含属性,如类型和访问权限。内存管理单元(mmu)将两个阶段的属性组合在一起,以给出最终的有效值。mmu通过选择限制性更强的阶段来实现这一点。下图的例子中,device类型比normal类型更具限制性。因此,最后的类型是device。如果反过来,stage1=normal,stage2=device,最后的结果是一样。
图5
这种组合属性的方法适用于大多数用例,但有时hypervisor可能希望覆盖这种行为。例如,在vm的早期启动期间。
vm的ipa地址空间同样被划分成内存与外围设备的区域。vm可以访问实际物理外围设备(通常称为直接分配的外设)和虚拟外设。hypervisor在软件中完全模拟虚拟外设。
探讨物联网M2M市场、联网标准与产品设计
东莞华为扩展坞批发产品数码革命的首款
爱普特重磅发布功耗低至1uA的通用型MCU APT32F110X,加码工业控制市场
电子系统中的电磁干扰射频干扰和电磁脉冲的抑制方法解析
基于CPLD技术与RS-232串口通信实现任意波形发生器的连接设计
arm架构的虚拟化是什么
锐龙ThreadRipper处理器曝光 加速频率达到4.17GHz
NCP1421设计的升压型LED手电筒电路
小米MIX2概念图曝光:后置双摄像头 屏占比接近100%
纺织印染行业物物联网解决方案
低阻抗麦克风放大器的电路图分享
兰和科技中标武汉理工大学智能门锁管理系统项目
以DSP和FPGA技术为基础的伺服控制系统设计详解
巨控GRM-OPC-SMS组态短信报警方案
美格信-骨传导单体振子测试
前端总线频率是什么?
关于夜狼安防总线型防盗报系统产品的特点和优势分析
微型空气质量监测仪的功能特点及技术参数
AR产品平台公司杭州灵伴科技(Rokid)成为新晋独角兽企业
数据合并转换器电路的工作原理分析及如何采用EPM7128芯片实现