Gunyah™是一款高性能、可扩展的Type-1(裸机)超虚拟器,可用于具有较高要求的电池供电式、实时性、安全关键性系统,本公司已经开发了高通科技公司芯片组上所使用pKVM(受保护内核虚拟机)的替代品,为其开发Linux驱动程序的团队需要内核维护者和社区的积极投入。基于Gunyah,我们可以在汽车、移动宽带、物联网和可穿戴设备等各种用例中使用一种虚拟机管理程序。
本文说明了Linux内核中为增加对Gunyah的支持所进行的工作,以及提供上游版本补丁的计划。本文还说明了为将有关Gunyah的支持从CrosVM虚拟机管理器(VMM)扩展到虚拟操作系统模拟器(通用、开源机器模拟器和虚拟器)所进行的工作。利用该团队正在开发的Linux驱动程序,可以实现虚拟操作系统模拟器等应用程序与虚拟机管理程序的交互。您可以了解如何自己在Gunyah上进行虚拟机的测试启动。
(这是本人在Linaro Connect大会上所做演讲“(QEMU)的Gunyah加速器”的总结。详情和链接见下文。)
项目1:持续的Gunyah开发
Gunyah是高通公司提供的一款开源的Type-1超虚拟器,主要关注电池供电设备的安全性和性能。作为一款轻量级的通用微内核,其具有足够的功能来管理虚拟机。
如以下方框图所示,该架构可支持多个操作系统,攻击面小,并且包含一个资源管理器(RM):
资源管理器是一种在第1执行等级(EL1)上运行的虚拟机(VM),并与第2执行等级中的Gunyah超虚拟器核心紧密配合。资源管理器实现了管理虚拟机所需要的某些策略,比如创建和启动虚拟机的繁重工作。资源管理器是不同执行等级管理程序的集成组件。
受保护和未受保护的虚拟机
托管某些保密/敏感工作负载的受保护虚拟机从一开始就是Gunyah的主要关注点。我们不希望手机上的安卓程序处理敏感任务,比如面部认证或手机银行凭证验证。因此,在应用程序的这一阶段,可以将显示器、触摸屏或摄像头的控制转移到受保护的虚拟机,从而对敏感信息进行验证。此后,可以在安卓上运行应用程序的其余部分。
Gunyah支持两种主要类型的虚拟机:
- 受保护虚拟机:即虚拟机中的内存从主机中隔离。
- 不受保护虚拟机:即虚拟机的内存可以完全被主机访问。
此外,受保护的虚拟机有两种类型:
1.高通可信虚拟机(QTVM)——对于该类虚拟机的主执行映像,应使用高通工具进行签名。其管理程序确保在允许虚拟机启动之前,存储器中加载的虚拟机映像由Trustzone(高通公司的安全软件)进行验证。除了内核以及内存虚拟盘之外,虚拟机的执行映像还包含一个设备树(DT),可以指定虚拟机需要访问的设备。这种静态设备树意味着某些虚拟机资源(例如:存储器量和虚拟中央处理器数量)在本质上为静态。
2.Google虚拟机 – 该类虚拟机由安卓虚拟化框架(AVF)定义。在这种情况下,管理程序不会强制进行虚拟机映像身份验证。相反,身份验证应在PVM固件中进行(一种在虚拟机内核接管前在虚拟机中运行的二进制程序段)。在这种情况下,虚拟机使用的设备树处于动态:即,在运行时生成。
Gunyah特性
- 受保护虚拟机的内存为其专有,不能被其所在宿主机访问。在超虚拟器中,这是使用CPU基于页表的内存保护特性实现的。虚拟机管理程序修改了与主机操作系统相关的第二级页表,导致主机失去对虚拟机内存的访问权限。
当然,在某些情况下,需要在受保护虚拟机与其主机之间共享内存。但是,到目前为止,Gunyah还没有为受保护的虚拟机提供任何应用程序接口,以便与主机共享其部分私有内存。相反,主机可以为虚拟机以共享或私有模式分配某些内存,这需要在虚拟机开始执行之前进行。例如,作为虚拟机创建过程的一部分,主机可以分配500 MB的内存作为虚拟机的私有内存,并分配100 MB的内存作为共享内存使用。
对恶意设备的防护是基于系统内存管理单元(SMMU)实现的。例如,分配给主机的设备不能使用直接内存访问(DMA)来访问受保护虚拟机的内存。可以设置与设备关联的系统内存管理单元中的第二级页表,以便设备在访问受保护虚拟机的内存时发现故障。
- 通用中断控制器(GIC)在超虚拟器第2执行等级虚拟化。
- 支持VCPU的代理调度方案和本地调度方案。在代理方案中,主机调度器以智能方式处理VCPU的调度。主机调度器可具有高级算法,能够提高虚拟机的性能和功耗。在本地方案中,虚拟机管理程序调度器直接处理VCPU调度,这对于某些关键虚拟机非常可取。
- 虚拟机中间物理地址空间的第一个千兆字节可用作内存映射输入/输出(MMIO)区域,并且可以捕获和模拟该区域。
- 系统热复位后,受保护的虚拟机内存被清理。可能由于各种原因触发热复位;例如,当主机操作系统中出现死锁时。在某些平台上,在热复位之后,虚拟机内存内容会被保留,其中可能包括在重置时处于活跃状态的受保护虚拟机数据。为了防止主机操作系统在重新启动时访问该类数据,Gunyah使用Trustzone软件清理虚拟机内存,该软件在热复位后首先运行。
- Gunyah提供了pre-host(裸机)虚拟机,可以在UEFI固件启动过程中早早启动(甚至在主机操作系统开始启动之前)。这对于需要在引导过程中很早就开始工作并且不能等到主机启动的虚拟机非常有用。
- 为了确保虚拟机相互通信,超虚拟器支持共享内存、门铃机制和消息队列。
- Gunyah目前可支持需求分页。以前,如果您想启动一个500MB的虚拟机,则在Gunyah开始执行虚拟机之前,必须分配和固定全部500MB。但是,如果虚拟机仅需要100 MB就可以正常运行,内存就会浪费。因此,我们在管理程序中添加了对需求分页的支持,以实现更好的内存管理。目前,当虚拟机访问尚未分配的有效页面时,主机会出现故障,从而分配不同大小的页面并由超虚拟器映射到虚拟机中。
- 利用设备直通,虚拟机可以分配并直访问某些设备。我们正在为汽车、物联网和移动设备等用例优化Gunyah。
项目2:Linux Gunyah驱动程序
我们正在积极开发的Gunyah驱动程序即将被上游Linux内核社区所接受。如下图所示,该驱动程序旨在确保虚拟机管理程序(例如:CrosVM和QEMU)能够管理Gunyah超虚拟器上的虚拟机:
该驱动程序运行在第1执行等级运行,并提供虚拟机管理程序和超虚拟器之间的接口。驱动程序为运行VCPU、注册事件、创建虚拟机和VCPU等标准任务提供了用户应用程序接口。另外:
- 可利用显式ioctl启动虚拟机。我们采用了这条路径,而不是将其折叠到运行VCPU的应用程序接口中。
- 另一个ioctl告诉驱动程序与虚拟机共享并向虚拟机借用内存。共享和借用之间的唯一区别是,借用的内存受保护,因此借用应用程序接口对于分配受保护虚拟机的专有内存非常有用。请注意,我们发布的v17上游驱动程序目前并不支持借用应用程序接口。但是,在安卓共用内核中包含的驱动程序版本①的支持借用应用程序接口。
- 为虚拟机管理程序提供的ioctl可以指定设备树在虚拟机内存中的位置。在允许启动虚拟机之前,需要由资源管理器对虚拟机设备树进行验证。
- 目前还没有关于设置和获取动态VCPU寄存器的规定。相反,管理程序设置了引导VCPU的初始寄存器环境。
我们打算未来对Linux驱动程序进行更改,以增加对不同虚拟机类型的支持,包括高通可信虚拟机和Google安卓虚拟化框架虚拟机。
①是指在ACK中使用GH_VM_ANDROID_LEND_USER_MEM:https://android.googlesource.com/kernel/common/+/refs/heads/android15-6.6/include/uapi/linux/gunyah.h
项目3:用于虚拟操作系统模拟器的Gunyah加速器
我们正在进行更改,以确保(QEMU)能够支持Gunyah作为一种加速器选项。我们预期一旦在上游接受了本公司的Linux内核驱动程序,就可以将更改合并到QEMU代码库中。
在Gunyah上启用虚拟机时,QEMU的标准调用情况如下所示:
qemu-system-aarch64 -cpu cortex-a57 -nographic --hda vm_disk.img -m 256M --accel gunyah -machine virt,highmem=off,protected-guest-support=prot0 - object arm-protected-guest,id=prot0,swiotlb-size=16777216 -append "rw root=/dev/vda rdinit=/sbin/init earlyprintk=serial panic=0" -kernel Image
关于QEMU更改的若干要点:
- 仅支持将AArch64作为目标。
- 参数- accel gunyah指定了使用Gunyah加速器。
- 支持受保护和不受保护的虚拟机类型。
- 我们运行了开源版本的Gunyah,从而在高通片上系统和QEMU虚拟平台上测试了虚拟机启动情况。关于如何使用开源版本在QEMU虚拟平台上测试VM启动的说明已经提供。
- 我们为Arm virt机器平台引入了某些更改内容。
- 支持受保护虚拟机(客户端),命令行显示如下:
-machine virt, protected-guest-support=prot0 - object arm-protected-guest,id=prot0,swiotlb-size=16777216
“switlb -size”表示QEMU需要分配并与虚拟机共享的共享内存区域的大小。该区域在设备树中被标记为保留区域,并与Linux内核的受限直接内存存取池功能相关联。
-
- 我们随后注意到,有其他方正在为虚拟机平台添加类似的支持。必要时,我们将进行审核并与其合作。
- 支持针对特定加速器的设备树定制。例如, Gunyah需要在设备树中查看额外的属性,比如虚拟机需要的调度方案,以及管理程序为支持中断注入(门铃)而需要创建的虚拟设备。
- 仅支持代理调度虚拟机。可以发布未来更改,以添加对管理程序调度虚拟机的支持。
- 下图说明了QEMU如何将中断注入虚拟中。由于GIC是由超虚拟器本身处理,因此我们将门铃创建为虚拟设备,并将其绑定到各种中断请求线路上。QEMU为其希望注入的每个中断注册一个eventfd。每当其写入eventfd时,Gunyah Linux内核驱动程序就会激活相应的门铃来激活它的中断请求。
轮到你了
您可以遵照补丁系列中发布的指示,并在Gunyah管理程序上测试启动虚拟机。
是否无法使用运行Gunyah的高通片上系统?不用担心 – 您仍然可以使用虚拟操作系统模拟器来模拟运行Gunyah管理程序的通用ARM机器,然后使用支持Gunyah加速器的单独QEMU二进制文件,以便在其中启动虚拟机。
要了解更多细节,请观看本人在2024年Linaro Connect 2024大会上的演讲“QEMU的Gunyah加速器”,或参考本人在QEMU邮件列表上发布的补丁。
目前,我们在 Developer Discord上有一个专门的开源频道 – 加入志同道合的开发者社区,相互联系、获得支持并交换想法。
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。
骁龙与高通品牌产品属于高通科技公司和/或其子公司产品。