虚拟化技术在便携移动设备的应用
2022-03-29郭荧炎韦淼杨嘉豪李哲宇吴亚军
郭荧炎 韦淼 杨嘉豪 李哲宇 吴亚军
摘 要:本文旨在说明普通的便携式移动平台(例如智能手机)上实现并运行基于KVM虚拟机的具体方法。并以常见的高通MSM8916平台为例,阐述了在ARM指令集的设备上实现KVM的过程与难点。以及在便携式移动设备上运用虚拟化技术的具体价值和前景展望。
关键词:KVM;ARM64;便携式设备;虚拟化
虛拟化(Virtualization)指的是利用软件技术在一台硬件设备上模拟出一至多台设备,各个虚拟设备中的操作系统及其应用程序彼此隔离,不受影响。
目前,由于市场上主流芯片厂商的提供的软件开发框架普遍缺少对虚拟化的支持,导致ARM平台的虚拟化技术有关研究虽然有所发展,但是始终无法在市面上的消费级产品中得到实际应用。若在智能设备中引入虚拟化技术,将会在平板与智能手机等使用场景中,加强用户的安全性,以及大大改善国产智能设备操作系统对Android、Windows等常见平台的兼容性,加速其普及程度。其次,虚拟化技术在智能设备中的引入也为废旧设备的重复利用创造了条件,可以将回收的智能设备所提供的算力资源重新利用,为小型云计算中心提供成本更低、功耗更小的解决方案。
一、实现原理
KVM的全称为Kernel-based Virtual Machine,意为基于内核的虚拟机。该虚拟机实现作为Linux内核的一个模块被集成于Linux内核源代码中。KVM通过Linux内核原本提供的任务调度、与硬件外设交互的实现来完成对机器的虚拟。KVM高度依赖于硬件支持,相较于纯软件实现的虚拟化,这种实现能够更贴近程序在实机上运行的效能。
在高通平台的ARMV8环境中,ARM Trustzone将整个系统层级分为Secure World与Normal World。Secure World意为安全环境,该环境用于处理例如人脸识别等与用户隐私有关的操作。Normal World用于运行Linux 内核和普通的应用程序,两个环境通过QSEECOM接口进行交互。
ARMV8标准又将系统层级又分为4个Exception Level[1]:
EL0: 用户空间中运行的应用程序,特权级最低。
EL1: Secure World中运行高通的TrustOS实现QSEE[2],用于完成一些安全有关的操作。而Normal World运行Linux操作系统。
EL2:ARMV8专为虚拟化设计的层级,只在Normal World中出现。
EL3:用于切换Normal World与Secure World,Normal World中的应用程序需要发送SMC指令到EL3层才可以进入Secure World。
在高通平台中,启动先从位于SOC芯片内部的PBL(Primary Bootloader)开始执行,如果启动失败PBL则会创建基于Qualcomm Sahara协议的串口设备用于写入新的程序。PBL找到位于EMCP上的SBL1(Second Bootloader Stage 1)并跳转,SBL1阶段将会在ARM32模式下初始化总线、时钟、DRAM等外设,同时加载位于不同分区中的TrustZone、HYP、Aboot(LittleKernel Bootloader)固件。SBL1完成对所有固件的装载后会进入ARM TrustZone并将处理器重置进入ARM64状态,TrustZone完成初始化后跳转至Hypervisor,Hypervisor固件在EL2特权级完成对EL2的初始化然后跳转至EL1特权级以ARM32模式启动LittleKernel Bootloader提供Fastboot接口或跳转到Linux内核。
由于Linux内核是以ARM64指令集编译的而ARM处理器的工作模式只有在切换特权级时才能切换,LittleKernel Bootloader启动时需要使用SMC(Secure Monitor Call)指令切换至EL3状态最后以ARM64工作模式切换至EL1引导Linux内核。
在Linux内核中使用KVM虚拟机需要让整个内核在EL2特权级中启动以执行虚拟化相关的指令,然而LittleKernel Bootloader最后通过SMC将特权级置为EL1,这使得KVM无法正常初始化。
实现虚拟化的方式可以通过重写Hypervisor固件与LittleKernel Bootloader得到。由于高通在MSM8916提供的TrustZone固件的PSCI (Power State Coordination Interface 电源管理接口)标准实现有些许问题,经实验证明,不能简单的在LittleKernel Bootloader启动阶段跳转至EL2特权级的Hypervisor固件然后在EL2状态下启动内核与初始化Hypervisor(KVM),这会使TrustZone以不正确的方式初始化另外的CPU核心,让其他核心以ARM32模式启动。解决方案在HYP固件实现中调用一次切换状态的SMC调用,使TrustZone在完成SMC调用后始终处于ARM64工作模式,再在TrustZone完成EL3状态向EL1状态转换的瞬间使得EL1指令无法执行最后在EL2状态完成对异常的处理,在EL2特权级引导Linux内核与KVM模块。
经验证以上的方法在未开启Secure Boot功能的MSM8916设备上能够成功在EL2特权级启动Linux内核。但是在市面上的很多设备与开发模块都开启了Secure Boot功能。Secure Boot功能开启后在SOC的指定区域中写入OEM公钥,Aboot与SBL等启动所需的镜像都会被签名,启动时会对这些镜像进行验证若公钥的Hash值与SOC中储存的公钥的Hash值不同则拒绝启动。所以不能通过上述替换LittleKernel Bootloader与HYP固件的方式完成Linux内核在上述情况设备中的引导。
对于开启Secure Boot功能的设备,本文提出了如下的解决方案。
由于Secure Boot功能对公钥的验证仅限于Aboot之前的Bootloader,而Android Bootimg格式的Linux内核没有设置签名和公钥的检查,则可以通过将LittleKernel Bootloader打包成Android Bootimg格式以方便跳转,通过使用Aboot分區中已签名的Bootloader跳转至修改过引导顺序的LittleKernel Bootloader来绕过对Aboot的公钥Hash检查从而进入上述启动过程。
根据2017年Black Hat大会“Blue Pill for Your Phone”[3]对高通ARM TrustZone的逆向分析指出,在一些SCM调用中缺少对HYP区域内存的检查。可以利用此漏洞在LittleKernel Bootloader中动态替换Hypervisor内存中储存的内容,将能够让内核引导至EL2特权级的Hypervisor固件替换内存中通过检查的Hypervisor固件内容,实现跳转,最终成功加载KVM内核模块,在目标机器上实现EL2特权级指令的执行。
在用户层,本文使用的是Libvirt与Qemu完成对便携式设备虚拟化可行性的验证。Qemu是一个通用的开源机器仿真器,能够在一台机器上模拟所支持任何一个架构的整个系统或者类UNIX系统的用户环境,也可以结合内核中的KVM模块(Qemu负责对IO的模拟、KVM负责对CPU与RAM的模拟)获得接近在真实机器上运行的性能。Libvirt是管理虚拟化技术的一组守护进程、程序接口和管理工具,是对不同Hypervisor的一层封装,除了能够管理KVM虚拟机之外,还能管理其他Hypervisor实现,也可以通过网络对运行Libvirt守护进程的机器进行管理。
二、实验环境
本文中使用的设备搭载着高通MSM8916处理器,该SOC具有四个运行在0.9GHZ主频下的ARM Cortex-A53核心,采用ARMV8指令集,同时兼容ARM32指令架构。处理器接有一颗KMK8x000vm-b412的EMCP为程序的存取提供EMMC5.0标准的外存读写速度,基于LPDDR2技术的低功耗内存也能够准确的表现出这类ARM指令集的便携设备在真实的使用场景的功耗和性能。另外采用WCN3620芯片提供2.4Ghz WIFI连接,为实验的调试与数据的传输提供方便。
本文使用的软件部分环境基于最新的LTS版本的Linux 5.15内核与Debian 11 bulleye操作系统,这两者的组合不仅能保证实现在新架构与新版本的依赖库的可行性,还能够减少由于闭源软件等一些不可控的因素对KVM技术最终在设备上呈现的效果造成影响。另外,为了贴合ARM便携设备的使用场景,Bootloader采用在智能手机中常用的LittleKernel Bootloader,用于配置和启动Linux内核和通过usb提供PC交互的基于Fastboot协议的调试接口。在用户层的模拟中使用的虚拟机平台是Qemu+Libvirt,虚拟机的环境为Ubuntu Server 20.04 + EDK2,其中Ubuntu Server提供测试环境,EDK2提供通用的UEFI启动器启动Ubuntu Server。
三、实验结果
在实体机下的Debian环境中使用著名的性能测试工具UnixBench在空载的情况下运行Unixbench 5.1.2可执行文件,Unixbench使用GCC 10.2.1进行编译,测试结果如下所示。
在KVM虚拟机中,在Ubuntu Server 20.04中同样使用UnixBench 5.1.2进行测试,测试结果如下所示。
根据测试结果得知,虚拟化技术在便携式设备常用的ARMV8指令集平台上完全可行,且性能逼近实机运行的速率,是一个完全能够用于实际生产环境中的技术,而且在开启Secure Boot功能的设备上,性能也能完全不受为规避Secure Boot多出的启动流程的影响,也为未来对市面上的产品进行再回收与二次开发提供了可能。
四、总结与展望
虚拟化技术作为许多云计算与数据中心的核心技术,在X86平台上已经发展成为较为成熟的技术之一,主要用于服务器的批量管理,将服务器集群所能提供的物理资源转换成可被重复划分的逻辑资源,提高了服务器的利用效率。
在ARM64平台上,虚拟化技术不仅能实现传统X86架构上对物理资源的灵活划分,还能利用RISC指令集带来的低功耗优势,在更低的功耗下实现相同的任务。另外基于ARM64平台的芯片其成本要远远低于传统的基于X86指令集的芯片,甚至也可以使用回收的ARM便携设备组成服务器集群来提供云计算等服务,这项技术的普及也将大大减少服务提供商的搭建成本和维护成本,降低了搭建数据中心的门槛也推进了废旧电子产品的重复利用。
在面向最终用户的市场中,本文阐述的技术也起着十分重要的作用。通过对硬件的完全虚拟而性能又贴近实机运行速度的特性也可以将用户使用的应用程序的运行环境与外部的操作系统完全隔离开来,降低了有害应用对设备造成影响的可能性。另外也能通过该项技术完善基于Linux技术的国产操作系统对于为Windows与Android设计的应用程序的兼容性,应用生态处于发展中的操作系统也可以利用该技术迅速建立应用生态。另外基于KVM技术构建的虚拟机间接通过模拟硬件为所有在虚拟机运行的应用程序提供了统一的运行环境,大大减少了ARM指令集不同平台普遍存在的差异性与碎片化。
参考文献:
[1]Loopers. ARMv8-A Exception Levels.CSDN[DB/OL].https://blog.csdn.net/longwang155069/article/details/105010182,2020-03-21.
[2]谢君. Qualcomm QSEECOM 接口漏洞(CVE-2019-14040)分析.易学教程[DB/OL].https://www.e-learn.cn/topic/3583766,2020-4-18.
[3]Oleksandr Bazhaniuk. Blue Pill for Your Phone. Black Hat USA 2017 conference[DB/OL].https://www.blackhat.com/docs/us-17/wednesday/us-17-Bazhaniuk-BluePill-For-Your-Phone.pdf,2017-8-16.