ARMv8处理器体系结构中的虚拟化功能

基于ARMv8的系统中的虚拟化设施在这些系统中扮演着特殊角色,并且由几个组件组成。尽管ARMv7具有特殊的CPU模式来运行虚拟机监控程序作为扩展,但在ARMv8中,它已成为体系结构的一部分,并且已以EL2的名称集成到特权级系统中。同时,此模式仅解决与CPU访问内存和外围设备等系统资源相关的问题。为了提高虚拟环境中设备启动的事务处理效率,已经为基于ARMv8的系统开发了许多组件,例如新的中断控制器和IOMMU。本文从系统软件开发的角度概述了这些功能。

基于ARMv8的系统中的虚拟化的组织如图1所示:EL2特权级别运行虚拟机监控程序,以控制虚拟机(VM)代码的执行以及虚拟机之间的资源共享。VM实例保留EL1(操作系统内核,特权代码)和EL0(非特权代码)级别。地址转换分为两个阶段(图2):在第一阶段,使用第一级转换表(保存在TTBR0_EL1 / TTBR1_EL1寄存器中的指针)从虚拟地址计算出所谓的中间物理地址(IPA);在第二阶段,使用管理程序准备的第二级表计算实际物理地址(指针存储在VTTBR_EL2寄存器中)。这样的组织提供了有效的特权分离,并将VM与硬件隔离。例如,这允许

图1.基于ARMv8的系统中的虚拟化

两级翻译

两级转换允许VM维护自己的转换表,同时还允许虚拟机监控程序完全控制最终结果。EL2特权级别专门设计用于执行管理程序代码,并且与其他级别有所不同。因此,这是最低特权级别,可以访问特殊寄存器VTTBR_EL2,VTCR_EL2以及许多其他打算用于VM管理的特权。

在ARMv8架构的原始版本中,仅为管理程序提供了一个转换表,为当前VM提供了另一个转换表。系统管理程序可以访问几个特殊寄存器,通过这些寄存器可以设置EL1级别的VM可见的配置参数,例如CPU标识符(制造商,版本等)和多处理器系统ID。这样一来,就可以将运行在同一系统上的VM暴露给不同版本和制造商的虚拟SMP系统和CPU的不同拓扑。

如果VM中发生需要管理程序干预的事件,则其处理如下:

EL2级别发生异常;

根据其类型,从表中调用适当的处理程序(地址存储在VBAR_EL2寄存器中);

执行必要的动作;

如果需要,将所需的值放入寄存器中;

虚拟机管理程序将返回到发生退出的虚拟机(如果虚拟机管理程序进行了相应的设计,则会切换到另一个虚拟机)。

图2.地址转换分为两个阶段

通过HCR_EL2寄存器位定义发生此类VM退出异常的事件。因此,这些可以是系统寄存器访问,包括在EL1特权级别可用的访问(例如TTBR0_ EL1 / TTBR1_EL1,FAR_EL1),高速缓存和TLB刷新指令,常规异常(中断,包括来自计时器和不受支持的操作代码的中断),以及中断和事件等待指令。两级地址转换使能也由该寄存器控制。此外,在EL2级别上有一个单独的硬件计时器,它允许虚拟机管理程序配置一个周期性中断,通常用于启动VM切换,类似于现代OS中切换任务的方式。

切换过程还包括保存当前VM上下文,加载新VM以及将控制权转移给它。同时,VM可以类似于EL0级别的非特权代码执行系统调用的方式来执行虚拟机管理程序调用。为了执行这样的调用,VM将参数放置在寄存器中并执行“ hvc”指令。这会导致以标准方式处理的EL2特权级别的异常。通常,这在调用标准化PSCI协议功能时发生。

还应该提到的是,管理程序可以拦截从VM到受信任代码例程的调用(例如,在此处实施非虚拟化环境中的PSCI,并以最高特权级别EL3处理对它的调用)。ARMv8体系结构还包含其他功能,可以提高虚拟化环境的性能:除了虚拟机管理程序可以分配的共享域以减少缓存一致性流量之外,还可以为每个VM分配自己的标识符或VMID。它的使用可以避免在切换虚拟机时“昂贵”的TLB刷新。

ARMv8的原始版本提供了8位标识符,后来又扩展为16位。另外,在ARMv8.1中,作为VM主机扩展的一部分,添加了EL2级别的第二个转换表TTBR1_EL2,以便Type 2的虚拟机管理程序(属于主机OS)具有更多的可能性。同时,如上所述,功能齐全的虚拟化要求VM与虚拟机与外围设备(网络适配器,存储控制器等)进行交互,而虚拟机管理程序的参与最少,并且从设备到处理器的传送中断。

系统内存管理单元

ARMv8系统中虚拟化环境的这些方面由两个单元处理:通用中断控制器(GIC)和系统内存管理单元(SMMU)(图3)。SMMU以与CPU启动的内存访问相同的方式执行I / O地址的转换。该单元支持I / O地址的一阶段和两阶段转换。因此,转换和保护内存区域的好处可用于VM以及虚拟机管理程序中。因此,允许设备仅对特定的存储器地址范围进行读/写操作。

图3.系统内存管理单元(SMMU)

此外,有时通过SMMU在I / O缓冲区上组织分散收集操作很方便。转换阶段的用法模型与CPU内核的用法模型几乎相同(即,第一阶段的输出产生当前VM唯一的IPA,第二阶段的输出产生整个主机唯一的实际物理地址。系统)。SMMU转换表的格式类似于CPU的格式,但页面属性有所不同。支持4、16和64 KB的页面大小,以及一个或两个转换表,具体取决于寄存器设置和转换阶段以及完整的48位或52位地址空间。

每个涉及的设备都有其自己的翻译上下文(最终选择关联的翻译表集)。可以在多个设备之间共享单个上下文。单元使用所谓的流ID(取决于硬件的设备标识符)执行上下文选择。因此,对于PCIe设备(物理或虚拟功能),RID用作在PCIe配置空间中复制设备地址的标识符。SMMU具有自己的TLB,并支持VM ID进行加速。在错误的配置检测,转换错误和其他异常的情况下,SMMU会声明所谓的上下文中断(即,绑定到转换上下文的中断)。

SMMU的维护类似于CPU内存管理单元(MMU)的维护。但是,对处理器MMU的操作(TLB重置,转换结果检索等)是通过特殊指令执行的,而对于SMMU,它们是通过访问上下文寄存器来执行的。截至2017年底,SMMU规范已发布多个版本,最新版本为3.1。SMMU 3.0和3.1版支持扩展的流ID,并使用RAM中的表来匹配流和上下文的ID。这样的表可以具有一或两个级别。表元素包含指向也存储在内存中的上下文描述符的指针,以及与该元素相关的VM标识符,以及指向第二级转换表的指针。

上下文描述符又包含指向第一级转换表的指针。SMMUv3的重要功能之一是能够停止事务的执行直到软件做出响应。这种模型允许设备访问不在RAM中的页面(例如,换出到文件/交换分区中)或以推测方式分配的页面。SMMU还可以在转换表中自动设置更改(或脏)的页面指示位。这可以简化VM迁移,对VM状态进行快照等。SMMUv3还支持VM标识符掩码,该掩码允许在不同VM之间共享转换表,从而减轻了TLB压力。

在SMMUv3中,控制和事件信号均得到了显着重构:此单元使用事件队列,该事件队列是内存中的环形缓冲区,上下文中断被表示为队列中新描述符出现的中断所代替。要获取设备访问的页面,有一个单独的队列,即所谓的页面请求接口(PRI)。如上所述,不是上下文寄存器,而是使用内存中的控制块,并且通过将命令描述符写入命令队列并提交来执行上下文管理。

GIC在虚拟环境功能中起着至关重要的作用。在2017年底,该规范的第四个版本是最新版本,而第二个版本是针对ARMv8处理器的最小版本。由于必须在多处理器系统中传递中断(现有的实现可以具有256个或更多的硬件线程),因此GIC本身是相当复杂的设备。但是,本文仅考虑与虚拟化直接相关的那些控制器功能。大多数GIC寄存器未虚拟化,这导致在访问VM时退出。同时,该规范引入了诸如虚拟中断之类的概念。

中断虚拟化

虚拟中断可以分为两个虚拟组之一:0和1。组0保留所谓的快速中断请求(FIQ),而组1保留所有其他中断(中断请求,IRQ)。虚拟中断由处理器以与物理中断完全相同的方式处理。基于ARMv8的虚拟化环境中的中断处理的组织方式如下:将设备的物理中断发送到EL2级别(发送至管理程序),如果该中断旨在用于虚拟机,则管理程序会激活虚拟处理器上的相应虚拟中断。它。系统中断和服务中断都可以路由到管理程序。系统管理程序根据GIC规范在对物理中断进行虚拟化之前对其进行处理。

GIC对中断虚拟化的支持由代表虚拟中断的事件列表支持,这些事件列表存储在相应的寄存器中,并作为虚拟IRQ或FIQ处理。通过处理器寄存器接口对虚拟中断的控制类似于对物理中断的控制。因此,在虚拟处理器上运行的软件能够执行以下操作:

设置虚拟优先级掩码,

控制在组内解释虚拟优先级的方式,

确认虚拟中断,

降低虚拟中断的优先级,并且

停用虚拟中断。

为了管理虚拟中断,CPU接口提供了一组系统寄存器,它们与物理中断控制寄存器位于相同的地址。这意味着控制机制对于VM绝对是透明的。虚拟中断列表上的寄存器数量是实现定义的,但限制为16个。如果寻址到虚拟处理器的中断数量超出了可用寄存器的数量,则虚拟机管理程序可以将相应的事件存储在内存中,以将其写入释放的事件中。稍后注册。中断的优先级在硬件中执行。

虚拟接口生成寻址到虚拟机管理程序的中断,该信号通知虚拟机管理程序应相应响应的事件(空中断列表,启用和禁用组,针对不在寄存器中的中断的中断结束等)。除了专用外围设备中断(PPI)和共享外围设备中断(SPI),ARMv8系统还具有一类通过消息(消息信号中断(MSI))发出信号的中断,称为局部特定外围设备中断(LPI)。

GICv3和更高版本的GIC对此扩展类提供了扩展的支持,可以根据特殊规则(中断转换服务(ITS))处理中断消息。但是,这些功能在某种程度上与虚拟化有间接关系,但是有必要对其进行简要描述以提供对GICv4中引入的更改的总体了解。

图4.在基于ARMv8的系统中的虚拟化环境中,组件与中断控制器的接口和交互

在使用ITS时,设备通过使用GITS_TRANSLATOR寄存器中的目标地址发出写事务来发出事件信号。写事务由正在写入的数据(包含事件ID)和源标识符组成,该数据与SMMU相同。系统软件对ITS寄存器进行编程,以便它们指向内存中的设备,集合和中断存储器表,这些表包含处理来自相关源的事件的规则,这些事件指定了目标CPU内核和那里的中断ID。

中断导致未决中断表中元素的相应字段设置。对于GICv3,此机制仅针对物理中断(即,由设备直接发出信号的中断)定义。这导致在管理程序实施中的某些不便。特别是,它要求管理程序在软件中执行由ITS执行的所有操作。GICv4引入了以编程方式生成此类中断并将LPI转换为针对相应虚拟处理器设置的虚拟中断的功能,为此引入了描述中断与目标处理器的亲和力的其他表以及虚拟挂起的中断表。如果在中断到达期间正在映射到目标vCPU的目标物理CPU内核上执行具有不同标识符的VM,GICv4生成一个特殊的中断,该中断旨在通知系统管理程序。为了控制虚拟中断的转换,已将新的命令类型添加到ITS GICv4命令界面。

本文中描述的功能为虚拟化环境的实现奠定了坚实的基础,现在,各种虚拟机管理程序(第一和第二种)都很好地支持了这些功能。总体而言,根据软件开发人员的要求,CPU和系统设施体系结构都在不断开发中。因此,它将继续为有关该主题的新文章提供信息。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200525A0BO4L00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券