当前位置: 首页 > article >正文

ARM架构虚拟化原理

前言

ARM架构虚拟化扩展(Virtualization Extension)是在2010年作为ARMv7架构的一部分引入的,它为虚拟化提供了架构支持。在此之前,ARM系统上的虚拟化解决方案都是基于半虚拟化(paravirtualization)的,并没有被广泛使用。不过随着ARM CPU的性能不断提高,并从智能手机和平板电脑等移动设备向传统服务器进军,人们对ARM虚拟化的兴趣也在增长,因为对ARM来说,支持虚拟化对它的生态建设起到很重要的作用。于是,ARM虚拟化扩展就出现了,它的核心设计目标是构建ARM hypervisor,且它可以运行未经修改的Guest OS,而不增加显著的硬件复杂性,同时保持高水平的性能,而且也符合Popek和Goldberg的定理要求,关于这个定理,大家可以看下《一文读懂虚拟化原理》文章。

CPU虚拟化

虚拟化扩展侧重于在虚拟化上下文中支持现有的ISA,因此ARM没打算改变ISA单个指令语义,而不单独处理架构中限制虚拟化的指令。相反,虚拟化扩展引入了一种新的更高特权处理器执行的模式,这个模式在ARMv7架构首次引入时称为HYP(hypervisor)模式,在ARMv8架构以及之后称为EL2。

ARM架构上的CPU模式如图1所示,包括TrustZone(安全扩展)。TrustZone将模式分为安全和非安全两个世界,这两个世界与CPU模式是正交的。而且在EL3也提供了一种特殊模式:Monitor mode(监控器模式),用于在安全和非安全世界之间切换。如果实现了TrustZone,尽管ARM CPU在安全模式下启动,但ARM的引导加载程序(bootloaders)通常在早期阶段过渡到非安全世界。安全世界用于可信计算场景,如数字版权管理。不过需要注意的是,最新的ARM架构已经支持secure状态下的EL2 Hypervisor了。

图1 ARM处理器模式

不像以前的ARM架构支持多种kernel模式,ARMv8只有一个kernel模式:EL1。图1中为支持虚拟机扩展而引入的名为EL2的新CPU特权级别(也成为异常级别,Exception Level, EL),它构建于现有的user(EL0)和kernel(EL1)级别上,是虚拟化拓展的中心。EL2以trap-and-emulate机制来支持虚拟化,它是严格地比其它CPU模式(EL0和EL1)拥有更多特权的CPU模式。

为了支持虚拟机VM,运行在EL2中的软件可以配置捕获(Trap)来自EL0或EL1的各种敏感指令和硬件中断去EL2,这样系统使用起来更灵活了。比如,不支持资源复用的分区hypervisor可能不会捕获正常hypervisor会捕获的某些指令。允许VM支持使用ARM调试寄存器而不是对它们进行Trap在某些情况下是可取的。如果想要模拟与正在使用的CPU不同的CPU,则有必要捕获对CPU标识符寄存器的访问,但没有必要捕获运行完整hypervisor所需的其它访问。

为了允许VM与物理机相同的接口进行交互,同时将它们与系统的其余部分隔离,并防止它们获得对硬件的完全访问权,hypervisor在切换到VM之前要使能EL2中的虚拟化特性。然后VM将在EL0和EL1中正常执行,直到达到需要hypervisor干预的某些条件。此时,硬件进入EL2,将控制权交接给hypervisor,然后hypervisor可以管理硬件并提供跨VM所需的隔离。一旦系统hypervisor处理了该条件,CPU就可以切换回EL0和EL1,VM就可以恢复执行了。当在EL2中禁用所有虚拟化特性时,在EL1和EL0中运行的软件就像在没有虚拟化扩展的系统上运行一样,在EL1中运行的软件具有对硬件的完全访问权限。

ARM架构允许将每个Trap配置为直接路由给在EL1的VM,而不是EL2的hypervisor。例如,由EL0引起的系统调用或页表错误的Trap可以配置为直接路由到EL1,以便由Guest OS处理它们,而不需要hypervisor的干预。它避免在每次系统调用或页表错误时转到EL2,从而减少了虚拟化开销。此外,所有进入EL2的Trap都可以被禁用,单个非虚拟化kernel可以在EL1中运行并完全控制系统。与EL1相比,EL2中可用的控制寄存器数量减少了。例如,EL2只有一个页表基寄存器,而EL1可以使用两个。可以说,通过减少EL2中可用的控制寄存器的数量,因此也相应减少需要操作的状态数量,这样可以简化hypervisor的实现。

ARM的Virtualization Extensions提供了以下特性:

  • 处理器在任何时间点都只能处于一种CPU模式,即EL0,EL1或EL2。从一种模式到另一种模式的实际转换是原子的,但是从一种模式到另一种模式时根据需要保存和恢复状态的过程不是原子的。
  • CPU模式可以通过执行MRS指令来确定,MRS指令在任何模式下都可用。最开始的期望是无论有没有虚拟机,应用程序和操作系统仍然使用相同的CPU模式运行。但在这种假设下,EL2执行本身不能被虚拟化,并且不支持递归虚拟机,因为嵌套的hypervisor可以确定它不是运行在EL2。
  • EL2被设计用于虚拟化,但它只是一种更有特权的CPU模式,也可以用于其它目的。
  • 每种模式由不同的页表定义,都有自己完整线性地址空间。EL2有自己的translation regime,它定义了给定模式中使用的寄存器和页表格式。然而,EL1/EL0共享一个translation regime,因此它们的地址空间和页表都可以在EL1和EL0中访问。因为每个TLB 条目都会被标记上translation regime,因此只有在当前活跃地址空间的translation regime匹配上TLB条目的标记,才能算作命中了。由于TLB条目标记,因此在EL2和其它CPU模式之间转换时不需要刷新TLB内容。
  • ARM有两种类型的中断:正常中断(IRQ)和快速中断(FIQ),以及对应处理器当前模式的两个中断标志。EL1中的软件可以自由操作每种中断类型的中断标记而不会引发Trap。EL2可以配置每个中断类型要么直接传递到EL1,要么Trap到EL2。当中断直接传递给EL1时,由EL1直接配置的中断标志控制真正的物理中断。当中断Trap到EL2时,由EL1直接配置的中断标志控制虚拟中断。

内存虚拟化

ARM引入了一组额外的页表来将Guest physical address转换成Host physical address,并将此作为虚拟化支持的一部分。在运行VM时,使用ARM的硬件支持使用虚拟化物理内存,由VM管理的物理地址实际上是中间物理地址(Intermediate Physical Addresses, IPAs),也称为来宾物理地址(Guest physical addresses, gPAs),需要转换为主机物理地址(host physical addresses, hPAs)。因此,ARM提供了第二组页表,stage-2 tables,用于将guest物理地址(gPAs)和host物理地址(hPAs)。EL2可以完全禁用或启动Stage-2转换。Stage-2页表使用ARM新的LPAE(Large Physical Address Extension)页表格式,与kernel模式使用的页表有细微的区别。

图2为ARM中完整的地址转换机制。在stage-1阶段,从virtual physical address到guest physical address转换使用了三层页表;在stage-2阶段,从guest physical address到host physical address的转换使用了四层页表。可以使用HCR(Hyp Configuration Register)中的一个域段来启用或禁用stage-2转换。Stage-2第一层次(L1)页表的基寄存器由Virtualization Translation Table Base Register(VTTBR)指定的,这两个寄存器只能从EL2配置。

图2 ARM上使用LPAE内存长格式描述符的stage-1核stage-2页表遍历过程。虚拟地址(VA)首先转换为guest PA,最后转换为host PA。

中断虚拟化

ARM定义了通用中断控制器(Generic Interrupt Controller, GIC)架构。GIC分配从设备到CPU的中断,CPU查询GIC来发现中断的来源。在多核配置中,GIC尤其重要,因为它用于生成处理器间从一个CPU内核到另一个CPU内核的中断(Inter-Processor Interrupts, IPIs)。GIC分为两部分:distributor(分发器)和CPU interfaces(CPU接口)。系统中只有一个distributor,但每个CPU核心都有一个GIC CPU interface。CPU interface和distributor都通过Memory-Mapped interface(MMIO)访问GIC。Distributor用于配置GIC,例如,设置中断的CPU core affinity、完全启用或禁用系统上的中断、或将IPI发送到另一个CPU核心。CPU interface用于确认(ACK)和发送中断结束(End-of-Interrupt, EOI)信号。例如,当一个CPU内核接收到一个中断时,它将在GIC CPU接口上读取一个特殊寄存器,该寄存器对中断进行ACK处理并返回中断的编号。在CPU将从ACK寄存器中检索到的值写入CPU接口的EOI寄存器之前,将不会再次向CPU发出中断。

可以将中断配置为Trap到EL2或EL1。将所有中断Trap到EL1并让运行在EL1中的操作系统软件直接处理它们是有效地,但在虚拟机环境中不起作用,因为hypervisor失去了对硬件的控制。将所有中断Trao到EL2可确保hypervisor保留控制权,但需要在软件中模拟虚拟中断以向VM发送信号事件。由于中断和虚拟中断处理的每个步骤(如ACK和EOI)都必须经过hypervisor,因此管理起来很麻烦,而且成本很高。

GIC以虚拟GIC(vGIC)的形式提供硬件虚拟化支持,因此不需要在软件中由hypervisor模拟接收虚拟中断。vGIC为每个CPU引入了一个vGIC CPU接口以及相应的hypervisor控制接口。虚拟机被配置为vGIC CPU接口,而不是GIC CPU接口。在vGIC hypervisor控制接口上,虚拟中断是通过写入特殊寄存器(list registers)来生成。vGIC CPU接口将虚拟中断直接送到VM的kernel模式。因为vGIC CPU接口支持ACK和EOI,这些操作不再需要Trap到hypervisor去用软件模拟了,从而减少了在CPU上接收中断的开销。例如,模拟的虚拟设备通常通过软件API向hypervisor发起虚拟中断,hypervisor可以通过将模拟设备的虚拟中断号写入list registers来利用vGIC。它使vGIC直接将虚拟机中断送到kernel模式,并允许Guest OS的ACK和EOI虚拟中断,而不会Trap到hypervisor。请注意,distributor仍然需要在软件中模拟,并且VM对distributor的所有访问必须Trap到hypervisor。例如,当一个虚拟CPU向另一个虚拟CPU发送一个虚拟IPI时,这个将Trap到hypervisor,hypervisor在软件中模拟分发器的访问,并在接收CPU的GIC hypervisor控制接口上编程list registers。

计时器虚拟化

ARM定义了通用计时器架构(Generic Timer Architecture),其中包括对计时器虚拟化的支持。通用计时器提供一个计数器来实时测量时间的流逝,并为每个CPU提供一个计时器,它被编程为在一定时间后向CPU发起中断。Hypervisor和Guest OS都可能使用计时器,但是为了提供隔离和保持控制,Guest OS不能直接配置和操作hypervisor使用的计时器。来自Guest OS的这种计时器访问需要Trap到EL2,对于某些工作负载来说,相对频繁的操作会带来额外的开销。Hypervisor也可能希望虚拟化VM时间,因为VM可以直接访问计数器硬件,那就不符合虚拟化要求了。

ARM通过引入一个新的计数器(虚拟计数器)和一个新的计时器(虚拟计时器),为计时器提供虚拟化支持。可以将hypervisor配置为使用物理计时器,而将虚拟机配置为使用虚拟计时器。然后,虚拟机可以访问、编程和取消虚拟计时器,而不会对EL2产生Trap。Kernel模式访问物理计时器和计数器是由EL2控制的,但是在kernel模式下运行的软件总是可以访问虚拟计时器和虚拟计数器。此外,EL2配置一个偏移寄存器,它从物理计数器中减去,并在读取虚拟计数器时作为返回值。请注意,在使用通用计时器之前,读取计数器时内存映射操作,因此频繁操作读取的话,通常会Trap到EL2并产生额外的开销。


http://www.kler.cn/a/456667.html

相关文章:

  • #端云一体化开发# #HarmonyOS Next#《说书人》鸿蒙原生基于角色的对话式文本编辑开发方案
  • Elasticsearch:使用 Ollama 和 Go 开发 RAG 应用程序
  • 探索 .idea 文件夹:Java Maven 工程的隐形守护者
  • mysql建立主从集群
  • 排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
  • Android图形绘制之Shapes包详解
  • 【信息系统项目管理师】高分论文:论信息系统项目的资源管理(智慧储电站系统)
  • 机器学习详解(11):分类任务的模型评估标准
  • Python学习(2):注释、数字、文本、列表
  • 【漏洞复现】CVE-2022-41678 Arbitrary JMX Service Invocation with Web Interface
  • JS实现Table表格数据跑马灯效果
  • 游戏开发-UE4高清虚幻引擎教程
  • 硬件设计-时钟振荡器
  • R数据分析:工具变量回归的做法和解释,实例解析
  • VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件
  • MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)
  • 【视觉惯性SLAM:七、ORB-SLAM2:ORB特征提取】
  • php中laravel基于rabbit的异步队列实践与原理
  • 代码随想录算法【Day4】
  • Docker和Kubernetes(K8s)区别
  • js正则表达式 校验邮箱,非法字符限制输入
  • 在Linux的世界中怎么玩转定时器任务
  • WebSocket 在实时比分推送中的应用
  • JVM调优实践篇
  • 虚幻5 UE5 UNREALED_API d虚幻的
  • gesp(二级)(17)洛谷:B4064:[GESP202412 二级] 寻找数字