Shyper: An embedded hypervisor applying resource isolation strategies for mixed-criticality systems

作者:Yicong Shen, Lei Wang, Yuanzhi Liang, Siran Li, Bo Jiang

DATE '22: Proceedings of the 2022 Conference & Exhibition on Design, Automation & Test in Europe.March 2022.Pages 1287 - 1292.

https://doi.org/10.23919/DATE54114.2022.9774664

Shyper:一个面向混合优先级系统的层次化资源隔离策略嵌入式虚拟机监控软件

翻译人:wheatfox

摘要

随着物联网技术的发展,现代嵌入式系统正在向多目标和混合优先级系统迈进,在该场景下,虚拟化技术是保证不同优先级任务隔离的关键技术。传统的面向服务器的虚拟机监控软件(Hypervisor)如KVM和Xen优于性能和安全方面的原因很难应用于嵌入式场景,因此许多新的虚拟机监控软件如Jailhouse和Bao在近年出现,其通过静态分区方法解决了这个问题。然而,这种不灵活的资源隔离方式假定虚拟机之间没有资源共享,导致资源利用率和虚拟机拓展性大大降低。这导致这些软件不能满足不同任务虚拟机的不同需求。本论文提出了一个高效、实时嵌入式虚拟机监控软件“Shyper”,其目标是对不同虚拟机的不同服务提供不同的优先级管理。为了实现该功能,Shyper支持细粒度层次化资源隔离策略,并设计了一系列新“VM-Exit-less”实时虚拟化技巧,为用户提供资源利用率和实时性能之间的平衡。在本论文中,我们将Shyper与主流虚拟机监控软件(KVM,Jailhouse等)进行比较来评估其可行性与高效性。

关键词

嵌入式系统,混合优先级,虚拟化,资源利用率,实时性

一、前言

随着物联网技术的不断发展以及相关产品的激烈竞争,如何让嵌入式产品具有不同可靠性的多种功能,在功率、体积、重量、价格限制下进行实时性能验证,是一个关键的问题。传统解决方案如AUTOSAR提供一个开放标准的软件结构,便于制造商自由地接入不同的软件组件,但是其无法保证接口的隔离性。现代嵌入式系统正在向多目标和混合优先级系统迈进。对于不同的任务的需求进行分类,放入不同的区域进行执行,并保证功能之间的隔离性是非常有必要的。不同区域之间的隔离与互不影响是一个非常关键的要求。

近年来,随着多核处理的普及,嵌入式软件有了对于多种复杂任务的并行计算的足够计算资源。然而传统的多核硬件设计上的实时操作系统不能保证多个任务的时间、空间隔离性,这导致了资源的大量闲置和可能的安全危机。随着多核处理器体系结构以及精简指令集计算机(RISC)型指令集对硬件虚拟化的支持,利用虚拟化实现为嵌入式系统(如自动驾驶和无人机)的不同功能实现多个隔离的分区成为可能。虚拟化技术引入了一个新的软件层称为虚拟机监控软件(Hypervisor或Virtual Machine Monitor,VMM),该层位于硬件层和应用层之间来提供时间和空间的隔离性。通过虚拟机监控软件,虚拟机(Virtual Machine,VM)可以在其提供的硬件抽象资源上独立运行且不需要修改。虚拟化允许:(1)动态添加或删除分区并且不影响其他分区;(2)分时运行,并为不同分区多路复用硬件资源;(3)预防不同分区之间的恶意攻击和数据泄露问题。

虽然想法很好,但是实现嵌入式虚拟化是一个不小的挑战。相比于服务器或个人电脑,嵌入式硬件往往对价格、重量、体积、功耗和实时性等方面有更严格的限制。除此之外,嵌入式硬件需要适配很多传统嵌入式实时操作系统(RTOS),例如Zephyr、QNX、Nucleus、VxWorks等。然而,传统的面向服务器的虚拟机监控软件如KVM和Xen不能通过简单重构来满足上面的要求。近年来,这些挑战驱动了许多嵌入式虚拟机监控软件的出现,其中大部分使用静态资源分区方法来减少实时性开销和可信计算基(Trusted Code Base,TCB)来适配嵌入式领域。然而,这些策略也降低了资源利用率和虚拟机拓展性,从而不适用于不同虚拟机运行不同任务、完成不同需求的情况。

为了解决上面的问题,我们提出了“Shyper”,一种新的Type-1型实时嵌入式虚拟机监控软件,并支持层次化的资源隔离策略。我们的工作的共享包括:

  1. 为不同优先级和需求的虚拟机提供差别化服务。Shyper提出了层次化资源分配策略,其通过手动将虚拟机分类至不同的场景来实现每个分类内细粒度的时间和空间资源隔离。
  2. 为了进一步保证实时性能,Shyper提出了两个新的减少虚拟机退出(VM-Exit-less)的技巧:任务远程核心分配(TRCA)和GIC局部直通(GPPT)。这些技巧让用户可以灵活控制资源利用率和实时性能的平衡。
  3. 最终我们对Shyper进行了系统化评估,并和其他主流嵌入式虚拟机监控软件(KVM、Jailhouse等)进行对比来验证其可行性与有效性。

二、相关工作

A. 传统的基于服务器的虚拟化技术

传统的基于服务器场景的虚拟机监控软件如KVM和Xen的主要设计目标是提供一个高效、公平和可拓展的虚拟机服务。因此,这样设计下的运行机制并不时候混合优先级的场景。例如,传统的虚拟机调度器往往不考虑虚拟机的优先级从而无法提供区分服务。最近几年,许多研究工作致力于研究新的调度算法,以使得KVM和Xen能够满足实时性要求,这些工作已经取得了一定进展。然而,这些调度算法不能完全消除虚拟机调度时的时间不稳定性,并且有很多机制或策略会深入影响虚拟机的实时性能。

除了调度,传统的面向服务器的虚拟机监控软件仍然在内存分配和设备模型(Device Model)上存在可能导致实时性被破坏的因素。例如,Xen的内存管理API非常强大,但是其实现非常复杂。当运行很大内存负载的程序时,由于缺页导致的虚拟机陷入会导致很大的时间不确定性。

另外,高优先级的虚拟机可能会被底优先级的虚拟机阻塞,这也被称为“优先级逆转”,在Xen中,当Dom0存在高占用时,并且和设备模型相关的进程得不到足够的CPU周期来处理IO请求时,DomU中需要IO服务的虚拟机就会被阻塞。 最后,传统基于服务器的虚拟机监控软件往往有一个很大的可信计算基,有些机制对于嵌入式场景的优化过于复杂,使得在嵌入式领域通过常见的安全认证非常困难。

B. 基于静态分区策略的嵌入式虚拟化

为了去掉历史包袱,近年研究人员提出了几种新的虚拟化结构设计(Jailhouse、Bao、ACRN),这些设计基于静态分区思想,其含义是静态的将所有硬件资源进行分割并独占分配给虚拟机。在这样的策略下,这些虚拟机监控软件通过虚拟机调度、内存分配、设备模型和其他机制大大降低了虚拟机开销,相比传统设计,其提供了一个相对较强的实时性能。另外,这种设计极大减少了可信计算基,使得其相关轻量化并容易进行验证。

但是,静态分区策略假定虚拟机之间不存在硬件共享,这将导致很低的资源利用率。例如,Jailhouse和Bao在IO上只使用直通方法,使得一个块设备(Block Device)无法被多个虚拟机共享。除此之外,由于虚拟机的虚拟CPU需要被独占地分配到物理CPU上,即使进行过量分配也很难提高CPU利用率。更糟糕的是,低资源利用率和对ss虚拟机拓展性地缺乏导致很难找到一个能够满足嵌入式系统的体积、重量和架构的虚拟机配置。

在有些情况下,这种静态分配的设计必须要被打破,这往往发生在有些硬件资源必须进行复用的情况下。以Jailhouse和Bao为例,两个虚拟机监控软件在支持GICv2或v3的设备上均无法消除陷入模拟和中断注入的开销。

三、Shyper设计细节

A. 系统结构

Shyper被设计为一个高效的、可拓展的实时嵌入式系统虚拟机监控软件,其设计目标如下:

(1)Shyper可以保证虚拟机间的强隔离性

(2)Shyper在可信计算基和内存开销方面应当轻量

(3)Shyper可以通过层次资源隔离策略对不同的虚拟机提供区别化服务

(4)Shyper应当保证优先虚拟机的实时性能

为了实现上面的目标(图1),Shyper将虚拟机划分为四种类型,对应不同的场景、优先级和实时性约束:

(1)管理虚拟机(MVM),类似Xen的Dom0,该虚拟机被用于向管理员和其他虚拟机的原生设备驱动服务提供外部控制接口。需要注意的是,MVM并不是必要的。

(2)客户虚拟机(GVM)用于运行通用操作系统例如Linux、Android、Windows等,这些操作系统不需要高优先级,会运行科学计算等任务。

(3)软实时虚拟机(SRTVM)用于启动实时操作系统(RTOS)如PREEMPT_RT Linux,其中会运行一些软实时任务。

(4)硬实时虚拟机(HRTVM)提供最强的实时性能,其被设计为运行硬实时任务,例如RTOS或裸机应用程序。

Shyper通过为每个虚拟机类型使用层次化的资源隔离策略、设计细粒度时空隔离来保证虚拟机之间的强隔离性并提供区别化服务,这些将在后文进行介绍。

为了尽可能减少Shyper的代码规模,Shyper在MVM内实现了虚拟机管理接口,允许管理员配置、启动和关闭虚拟机。另外,Shyper在MVM内也实现了可协调的直通设备模型来对大量原生设备驱动代码进行复用,解决了驱动移植的问题。除此之外,Shyper也通过在虚拟机中配置virtio网络的方式为GVM和SRTVM提供了NAT网络服务,并在虚拟机之间进行以太网帧转发,这使得MVM成为网络协议层复用的一个网关。

为了实现高资源利用率和高拓展性,Shyper实现了一系列设备模型如virtio、全模拟、直通和协调直通,并提供了对多种类型的设备如串口设备、存储设备、网络设备等的支持。虽然在MVM中实现协调的设备模型有很多优势,Shyper依然在内核中实现了其部分代码来保证一些高优先级虚拟机可能需要的低延迟和可靠IO服务需求。

为了支持实时虚拟化,Shyper引入了两个新的实时虚拟化技巧:(1)任务远程核心分配(TRCA)机制可以持续保证SRTVM的资源利用率和实时性能。(2)GIC部分直通(GPPT)能够消除vGIC的陷入模拟开销和中断注入的延迟。这两个技巧的细节将在后文详细介绍。

B. 层次资源隔离策略

时间和空间隔离式保证虚拟机只能受限地访问分配给其的资源(内存、寄存器等)的重要特性。在嵌入式虚拟化中,保证物联网设备能够安全地搜集和处理用户数据,并不被恶意虚拟机获取或消除是非常必要的。Shyper主要通过CPU和内存虚拟化来保证隔离性。

Shyper为不同的虚拟机类型对应的CPU分区实现了不同的虚拟CPU调度算法。首先,考虑到MVM需要处理来自其他虚拟机的磁盘和网络请求,运行MVM的物理CPU很可能用于支持特殊的任务和频繁的虚拟机调度,这将导致总体IO性能的急剧下降,所以MVM分区使用了固定分配策略。其次,对于GVM来说最主要的考虑是虚拟机调度策略的公平性,这里我们选择了一组Round-Robin虚拟机调度策略。SRTVM需要保证特定的实时性约束,可以使用已经在KVM和RT-Xen中使用的可预测的调度算法。最后,HRTVM虚拟保证决定的实时性能,所以我们使用了和MVM一致的固定核心分配策略,而HRTVM往往是一个单核系统。

为了保证不同虚拟机之间的数据安全,Shyper使用了ARMv8提供的两阶段地址翻译机制来保证每个虚拟机的内存数据不能被其他虚拟机进行获取和修改。为了减少可信计算基并最小化时间动态内存分配产生的时间不确定性,Shyper使用了以下三个策略:

(1)直接地址空间映射,其含义是Shyper、MVM和所有RTVM的中间物理地址(IPA)和实际的物理地址(PA)完全一致或保留一个固定偏移;对GVM来说,为了提供内存利用率我们使用了动态内存分配;(2)所有第二阶段内存和设备地址翻译的页表(除了模拟设备)均在虚拟机启动前分配,这避免了频繁虚拟机陷入和诸如Xen中复杂内存分配策略导致的巨大开销。

C. 实时性虚拟化机制 (1)GIC部分直通:GIC部分直通(GPPT)是一种用于解决中断虚拟化中中断延迟和频繁虚拟机陷入的技术。其核心思想是保留一个完整中断控制器的部分中断,这部分中断不会被虚拟机监控软件拦截并模拟,而是直通入上层虚拟机。虚拟机监控软件只需要保证GIC驱动中的中断配置里,使用GPPT的虚拟机的中断和其他虚拟机隔离。

图2展示了GPPT的实现。和传统硬件辅助vGIC虚拟化类似,其需要拦截所有虚拟机中对GIGD的MMIO访问,但是区别是Shyper会将自己的中断配置(由配置列表定义)直接传递给GICD,而不是实现vGIC,如步骤1-3所示。另一个区别是GICC而不是GICV被传入配置了GPPT的虚拟机,并且分配给其的物理CPU需要配置HCR_EL2.IMO和HCR_EL2.AMO字段来保证所有外部中断被直接注入EL1特权级而不是EL2。

为了保证中断资源的隔离,Shyper只帮助上层虚拟机传递其虚拟机配置中的自己的中断配置。

GPPT引入的另一个问题是启用GPPT的物理CPU将不能通过虚拟机监控软件对中断进行干涉,并且不能通过vGIC注入任何虚拟中断,这直接导致Shyper失去对物理CPU和其上的虚拟机的控制。Shyper使用了两个不同的方法来解决这个问题:(i)如果目标硬件能够提供ARM可信硬件(ATF)特性,Shyper能够通过SDEI(Software Delegated Exception Interface)接口的异步事件通知机制重新获取对目标CPU的控制,如步骤4-7所示。(ii)如果不支持ATF,则需要使用用户态中基于MVM和目标虚拟机的共享内存的轮询机制来保证虚拟机管理以及虚拟机间通信仍然在工作,如步骤8所示。

(2)任务远程核心分配(TRCA):TRCA是一种为了解决小节2.2中多种非抢占式的虚拟机监控软件阻塞事件导致的时间不确定性的新技术。当虚拟机运行时,虚拟机监控软件需要处理上层虚拟机的多种同步和异步请求,包括设备模拟、超级调用、Secure Monitor调度(SMC)等。当从虚拟机切换到虚拟机监控软件层时,所有虚拟机中发送请求的任务被完全冻结,这会导致一些高优先级的任务错过最终截止时间(Deadline)。为了降低这些事件对虚拟机实时性能的影响,一种新方法是将同步请求变换为异步请求,并发送这些请求到特定物理CPU处理。

在本文中,我们基于第三个优化思路引入了Shyper中的TRCA机制。不像Xen中的会导致高优先级虚拟机被低优先级任务阻塞的Dom0设计,Shyper不会将代码逻辑在某个特定虚拟机中完成,而是通过强制MVM或低优先级虚拟机的物理CPU来完成这个任务。TRCA包含四个部分:(i)任务生成模块;(ii)任务调度器;(iii)任务接收队列;(iv)任务执行单元。

图3展示了GVM和SRTVM中各自的virtio块请求流程,其中大量执行过程发生在虚拟机监控软件中,包括从virtio队列取出请求、IO向量合并、数据复制、设备驱动交互等等。这些执行过程会阻塞GVM的正常操作的大量执行事件,当启动TRCA机制时,SRTVM中绝大部分耗时的执行流程被转发到代理物理CPU上运行,剩下只留下任务准备和完成阶段,其显著地减少了在虚拟机监控软件层的运行时间。

四、实验结果

A. 实验设置

为了进行对比,我们选择了KVM和Jailhouse两个能够成功在ARMv8 NVIDIA Jetson TX2开发板上部署的主流虚拟机监控软件作为实验对象,对于虚拟化开销部分,我们设计了相关实验来调查中断延迟和虚拟机陷入性能开销。对于实时性能部分cyclictest是唯一测试选项。除此之外,提供负载的压力测试Stress也用于测试系统在某些负载下的情况。

B. 虚拟化开销

对任何虚拟机监控软件来说,中断延迟和虚拟机陷入直接影响虚拟机的计算和实时性能。在本文中,GPPT和TRCA两个机制被用于最小化这两个开销。

首先,为了准确地评估中断延迟,我们移植并重构了FreeRTOS使得其可以直接在TX2上以带GPPT的HRTVM和带vGIC的GVM运行,之后我们通过通用计时器(Generic Timer)评估了三个情况下的中断延时,如表1所示。

相比于在TX2上原生运行FreeRTOS,GPPT和vGIC分别有大约5倍和140倍更高的延迟。从结果来看,尽管GPPT和原生运行之间仍有差距,但其成功通过优化中断注入的额外开销和vGIC中vCPU上下文切换,将中断延迟缩短为vGIC的1/28。 在评估了外部中断延迟后,我们设计了一个实验来继续量化分析虚拟机陷入的额外性能开销。我们启动了四种不同的虚拟机并通过开始加入CPU、内存、磁盘负载。在测试中,Shyper负责记录所有类型的虚拟机陷入事件,包括频率和在Shyper内消耗的时间。 表2展示了整个测试中的频率以及总体虚拟机陷入开销,由于使用了TRCA,不同类型的虚拟机有着完全不同的表现:(1)MVM需要向GVM提供协调下的硬盘服务,并且其CPU核心需要处理SRTVM的远程任务(主要是磁盘IO任务),其虚拟机陷入开销主要来自中断注入、核间中断、硬盘中断和超级调用。总的来说,MVM运行的物理CPU在总时间的2.63%中运行在虚拟机监控软件层;(2)GVM主要的虚拟机陷入开销来自协调的磁盘服务,其主要由核间中断、维护性中断和virtio磁盘模拟所反应,其占用了总时间的1.8%;(3)SRTVM的主要虚拟机陷入开销和GVM类似,主要来自核间中断、维护性中断和virtio磁盘模拟,但是由于TRCA机制,其核间中断和virtio磁盘模拟开销明显小于GVM。从结果来看,SRTVM的CPU核心只有0.21%的时间位于Shyper中,为MVM的8%、GVM的11%;(4)由于使用GPPT和直通设备方法,HRTVM在整个测试中没有发生虚拟机陷入。

由于TRCA策略,几乎所有SRTVM的耗时任务被重新分配到了MVM的物理CPU上,其本身只留下了请求初始化和结果确认的开销。从测试结果来看,SRTVM保证平均的虚拟机陷入时间在1us以内,并且通过消除本来不可避免的开销将最大陷入时间限制到5us以下。

C. 实时性能

对于实时性能评估,我们使用cyclictest并将Shyper和L4T、KVM、Jailhouse进行对比。为了减少操作系统本身的影响,我们尽可能使用了相似的PREEMPT_RT Linux来代替每个虚拟机本来的操作系统内核。 为了避免多核架构的影响,每个Linux的启动参数被设置为“isolcpu=1 irqaffinity=0 idle=poll”。另外,在KVM主机的QEMU程序通过taskset程序限制到CPU0运行。由于不可能统一每个虚拟机的内核版本,我们根据内核版本和虚拟机类型对测试进行了分组。所有测试运行了600s。在测试中CPU、内存和IO通过Stress工具来进行现实运行条件的模拟。

如表3所示,L4T和Shyper-MVM的实时性能很接近,但Shyper-MVM最大延迟略高于原生运行情况。然而值得注意的是当Shyper-MVM进行驱动负载的协调时,或接收SRTVM和HRTVM的远程任务时,其实时性能将快速下降到GVM的层级。KVM是三种情况中最差的,其可能源于其主机Linux对QEMU设备模型的调度。Shyper-MVM的最大延迟优于KVM但仍远劣于原生情况,其原因来自Shyper所实现的vGIC的virtio设备。

图4表明抖动是随着时间而变化的。优于Jailhouse采用“减少虚拟机陷入”的设计思路,其最坏情况的延迟和标准差结果均很优秀,但是由于GICv2的限制使其不可能完全阻塞外部设备中断导致的虚拟机陷入。Shyper-SRTVM的TRCA策略可以保证模拟设备的虚拟机陷入可以被尽可能地减少。在IO负载地压力下,其仍然在所有测试中优于Jailhouse。Jailhouse和Shyper-SRTVM仍然使用基于MMIO陷入地vGIC模拟,然而HRTVM使用GPPT机制来进一步减少中断延迟,使其有着三个测试场景中最小的延迟和抖动。

五、未来工作

首先,嵌入式软件趋向于有着更高的安全性要求。我们的目标之一就是让Shyper通过EAL5+国际信息安全认证标准。另外,可信执行环境(TEE)目前正在如Android这样的嵌入式系统中使用来提高安全性。我们计划使用ARMv8的TrustZone技术来为Shyper引入TEE使其能提供安全相关服务。最终,我们希望能够将Shyper拓展到更多硬件平台和指令集(x86、RISCV等)。由于Shyper不依赖于在MVM中一定使用Linux,其能够在未来支持更多的操作选题内核。

六、结论

本文介绍了Shyper,一个面向多优先级系统的嵌入式虚拟机监控软件。通过层次化资源隔离策略和高效实时性优化机制,Shyper于嵌入式计算场景中,在资源利用率和实时性能上取得了平衡。我们的实验验证结果确认了Shyper的资源利用率和实时性能能够支持作为一个通用的嵌入式虚拟化解决方案。