郭熒炎 韋淼 楊嘉豪 李哲宇 吳亞軍
摘 要:本文旨在說(shuō)明普通的便攜式移動(dòng)平臺(tái)(例如智能手機(jī))上實(shí)現(xiàn)并運(yùn)行基于KVM虛擬機(jī)的具體方法。并以常見(jiàn)的高通MSM8916平臺(tái)為例,闡述了在ARM指令集的設(shè)備上實(shí)現(xiàn)KVM的過(guò)程與難點(diǎn)。以及在便攜式移動(dòng)設(shè)備上運(yùn)用虛擬化技術(shù)的具體價(jià)值和前景展望。
關(guān)鍵詞:KVM;ARM64;便攜式設(shè)備;虛擬化
虛擬化(Virtualization)指的是利用軟件技術(shù)在一臺(tái)硬件設(shè)備上模擬出一至多臺(tái)設(shè)備,各個(gè)虛擬設(shè)備中的操作系統(tǒng)及其應(yīng)用程序彼此隔離,不受影響。
目前,由于市場(chǎng)上主流芯片廠商的提供的軟件開(kāi)發(fā)框架普遍缺少對(duì)虛擬化的支持,導(dǎo)致ARM平臺(tái)的虛擬化技術(shù)有關(guān)研究雖然有所發(fā)展,但是始終無(wú)法在市面上的消費(fèi)級(jí)產(chǎn)品中得到實(shí)際應(yīng)用。若在智能設(shè)備中引入虛擬化技術(shù),將會(huì)在平板與智能手機(jī)等使用場(chǎng)景中,加強(qiáng)用戶的安全性,以及大大改善國(guó)產(chǎn)智能設(shè)備操作系統(tǒng)對(duì)Android、Windows等常見(jiàn)平臺(tái)的兼容性,加速其普及程度。其次,虛擬化技術(shù)在智能設(shè)備中的引入也為廢舊設(shè)備的重復(fù)利用創(chuàng)造了條件,可以將回收的智能設(shè)備所提供的算力資源重新利用,為小型云計(jì)算中心提供成本更低、功耗更小的解決方案。
一、實(shí)現(xiàn)原理
KVM的全稱為Kernel-based Virtual Machine,意為基于內(nèi)核的虛擬機(jī)。該虛擬機(jī)實(shí)現(xiàn)作為L(zhǎng)inux內(nèi)核的一個(gè)模塊被集成于Linux內(nèi)核源代碼中。KVM通過(guò)Linux內(nèi)核原本提供的任務(wù)調(diào)度、與硬件外設(shè)交互的實(shí)現(xiàn)來(lái)完成對(duì)機(jī)器的虛擬。KVM高度依賴于硬件支持,相較于純軟件實(shí)現(xiàn)的虛擬化,這種實(shí)現(xiàn)能夠更貼近程序在實(shí)機(jī)上運(yùn)行的效能。
在高通平臺(tái)的ARMV8環(huán)境中,ARM Trustzone將整個(gè)系統(tǒng)層級(jí)分為Secure World與Normal World。Secure World意為安全環(huán)境,該環(huán)境用于處理例如人臉識(shí)別等與用戶隱私有關(guān)的操作。Normal World用于運(yùn)行Linux 內(nèi)核和普通的應(yīng)用程序,兩個(gè)環(huán)境通過(guò)QSEECOM接口進(jìn)行交互。
ARMV8標(biāo)準(zhǔn)又將系統(tǒng)層級(jí)又分為4個(gè)Exception Level[1]:
EL0: 用戶空間中運(yùn)行的應(yīng)用程序,特權(quán)級(jí)最低。
EL1: Secure World中運(yùn)行高通的TrustOS實(shí)現(xiàn)QSEE[2],用于完成一些安全有關(guān)的操作。而Normal World運(yùn)行Linux操作系統(tǒng)。
EL2:ARMV8專為虛擬化設(shè)計(jì)的層級(jí),只在Normal World中出現(xiàn)。
EL3:用于切換Normal World與Secure World,Normal World中的應(yīng)用程序需要發(fā)送SMC指令到EL3層才可以進(jìn)入Secure World。
在高通平臺(tái)中,啟動(dòng)先從位于SOC芯片內(nèi)部的PBL(Primary Bootloader)開(kāi)始執(zhí)行,如果啟動(dòng)失敗PBL則會(huì)創(chuàng)建基于Qualcomm Sahara協(xié)議的串口設(shè)備用于寫(xiě)入新的程序。PBL找到位于EMCP上的SBL1(Second Bootloader Stage 1)并跳轉(zhuǎn),SBL1階段將會(huì)在ARM32模式下初始化總線、時(shí)鐘、DRAM等外設(shè),同時(shí)加載位于不同分區(qū)中的TrustZone、HYP、Aboot(LittleKernel Bootloader)固件。SBL1完成對(duì)所有固件的裝載后會(huì)進(jìn)入ARM TrustZone并將處理器重置進(jìn)入ARM64狀態(tài),TrustZone完成初始化后跳轉(zhuǎn)至Hypervisor,Hypervisor固件在EL2特權(quán)級(jí)完成對(duì)EL2的初始化然后跳轉(zhuǎn)至EL1特權(quán)級(jí)以ARM32模式啟動(dòng)LittleKernel Bootloader提供Fastboot接口或跳轉(zhuǎn)到Linux內(nèi)核。
由于Linux內(nèi)核是以ARM64指令集編譯的而ARM處理器的工作模式只有在切換特權(quán)級(jí)時(shí)才能切換,LittleKernel Bootloader啟動(dòng)時(shí)需要使用SMC(Secure Monitor Call)指令切換至EL3狀態(tài)最后以ARM64工作模式切換至EL1引導(dǎo)Linux內(nèi)核。
在Linux內(nèi)核中使用KVM虛擬機(jī)需要讓整個(gè)內(nèi)核在EL2特權(quán)級(jí)中啟動(dòng)以執(zhí)行虛擬化相關(guān)的指令,然而LittleKernel Bootloader最后通過(guò)SMC將特權(quán)級(jí)置為EL1,這使得KVM無(wú)法正常初始化。
實(shí)現(xiàn)虛擬化的方式可以通過(guò)重寫(xiě)Hypervisor固件與LittleKernel Bootloader得到。由于高通在MSM8916提供的TrustZone固件的PSCI (Power State Coordination Interface 電源管理接口)標(biāo)準(zhǔn)實(shí)現(xiàn)有些許問(wèn)題,經(jīng)實(shí)驗(yàn)證明,不能簡(jiǎn)單的在LittleKernel Bootloader啟動(dòng)階段跳轉(zhuǎn)至EL2特權(quán)級(jí)的Hypervisor固件然后在EL2狀態(tài)下啟動(dòng)內(nèi)核與初始化Hypervisor(KVM),這會(huì)使TrustZone以不正確的方式初始化另外的CPU核心,讓其他核心以ARM32模式啟動(dòng)。解決方案在HYP固件實(shí)現(xiàn)中調(diào)用一次切換狀態(tài)的SMC調(diào)用,使TrustZone在完成SMC調(diào)用后始終處于ARM64工作模式,再在TrustZone完成EL3狀態(tài)向EL1狀態(tài)轉(zhuǎn)換的瞬間使得EL1指令無(wú)法執(zhí)行最后在EL2狀態(tài)完成對(duì)異常的處理,在EL2特權(quán)級(jí)引導(dǎo)Linux內(nèi)核與KVM模塊。
經(jīng)驗(yàn)證以上的方法在未開(kāi)啟Secure Boot功能的MSM8916設(shè)備上能夠成功在EL2特權(quán)級(jí)啟動(dòng)Linux內(nèi)核。但是在市面上的很多設(shè)備與開(kāi)發(fā)模塊都開(kāi)啟了Secure Boot功能。Secure Boot功能開(kāi)啟后在SOC的指定區(qū)域中寫(xiě)入OEM公鑰,Aboot與SBL等啟動(dòng)所需的鏡像都會(huì)被簽名,啟動(dòng)時(shí)會(huì)對(duì)這些鏡像進(jìn)行驗(yàn)證若公鑰的Hash值與SOC中儲(chǔ)存的公鑰的Hash值不同則拒絕啟動(dòng)。所以不能通過(guò)上述替換LittleKernel Bootloader與HYP固件的方式完成Linux內(nèi)核在上述情況設(shè)備中的引導(dǎo)。
對(duì)于開(kāi)啟Secure Boot功能的設(shè)備,本文提出了如下的解決方案。
由于Secure Boot功能對(duì)公鑰的驗(yàn)證僅限于Aboot之前的Bootloader,而Android Bootimg格式的Linux內(nèi)核沒(méi)有設(shè)置簽名和公鑰的檢查,則可以通過(guò)將LittleKernel Bootloader打包成Android Bootimg格式以方便跳轉(zhuǎn),通過(guò)使用Aboot分區(qū)中已簽名的Bootloader跳轉(zhuǎn)至修改過(guò)引導(dǎo)順序的LittleKernel Bootloader來(lái)繞過(guò)對(duì)Aboot的公鑰Hash檢查從而進(jìn)入上述啟動(dòng)過(guò)程。
根據(jù)2017年Black Hat大會(huì)“Blue Pill for Your Phone”[3]對(duì)高通ARM TrustZone的逆向分析指出,在一些SCM調(diào)用中缺少對(duì)HYP區(qū)域內(nèi)存的檢查??梢岳么寺┒丛贚ittleKernel Bootloader中動(dòng)態(tài)替換Hypervisor內(nèi)存中儲(chǔ)存的內(nèi)容,將能夠讓內(nèi)核引導(dǎo)至EL2特權(quán)級(jí)的Hypervisor固件替換內(nèi)存中通過(guò)檢查的Hypervisor固件內(nèi)容,實(shí)現(xiàn)跳轉(zhuǎn),最終成功加載KVM內(nèi)核模塊,在目標(biāo)機(jī)器上實(shí)現(xiàn)EL2特權(quán)級(jí)指令的執(zhí)行。
在用戶層,本文使用的是Libvirt與Qemu完成對(duì)便攜式設(shè)備虛擬化可行性的驗(yàn)證。Qemu是一個(gè)通用的開(kāi)源機(jī)器仿真器,能夠在一臺(tái)機(jī)器上模擬所支持任何一個(gè)架構(gòu)的整個(gè)系統(tǒng)或者類UNIX系統(tǒng)的用戶環(huán)境,也可以結(jié)合內(nèi)核中的KVM模塊(Qemu負(fù)責(zé)對(duì)IO的模擬、KVM負(fù)責(zé)對(duì)CPU與RAM的模擬)獲得接近在真實(shí)機(jī)器上運(yùn)行的性能。Libvirt是管理虛擬化技術(shù)的一組守護(hù)進(jìn)程、程序接口和管理工具,是對(duì)不同Hypervisor的一層封裝,除了能夠管理KVM虛擬機(jī)之外,還能管理其他Hypervisor實(shí)現(xiàn),也可以通過(guò)網(wǎng)絡(luò)對(duì)運(yùn)行Libvirt守護(hù)進(jìn)程的機(jī)器進(jìn)行管理。
二、實(shí)驗(yàn)環(huán)境
本文中使用的設(shè)備搭載著高通MSM8916處理器,該SOC具有四個(gè)運(yùn)行在0.9GHZ主頻下的ARM Cortex-A53核心,采用ARMV8指令集,同時(shí)兼容ARM32指令架構(gòu)。處理器接有一顆KMK8x000vm-b412的EMCP為程序的存取提供EMMC5.0標(biāo)準(zhǔn)的外存讀寫(xiě)速度,基于LPDDR2技術(shù)的低功耗內(nèi)存也能夠準(zhǔn)確的表現(xiàn)出這類ARM指令集的便攜設(shè)備在真實(shí)的使用場(chǎng)景的功耗和性能。另外采用WCN3620芯片提供2.4Ghz WIFI連接,為實(shí)驗(yàn)的調(diào)試與數(shù)據(jù)的傳輸提供方便。
本文使用的軟件部分環(huán)境基于最新的LTS版本的Linux 5.15內(nèi)核與Debian 11 bulleye操作系統(tǒng),這兩者的組合不僅能保證實(shí)現(xiàn)在新架構(gòu)與新版本的依賴庫(kù)的可行性,還能夠減少由于閉源軟件等一些不可控的因素對(duì)KVM技術(shù)最終在設(shè)備上呈現(xiàn)的效果造成影響。另外,為了貼合ARM便攜設(shè)備的使用場(chǎng)景,Bootloader采用在智能手機(jī)中常用的LittleKernel Bootloader,用于配置和啟動(dòng)Linux內(nèi)核和通過(guò)usb提供PC交互的基于Fastboot協(xié)議的調(diào)試接口。在用戶層的模擬中使用的虛擬機(jī)平臺(tái)是Qemu+Libvirt,虛擬機(jī)的環(huán)境為Ubuntu Server 20.04 + EDK2,其中Ubuntu Server提供測(cè)試環(huán)境,EDK2提供通用的UEFI啟動(dòng)器啟動(dòng)Ubuntu Server。
三、實(shí)驗(yàn)結(jié)果
在實(shí)體機(jī)下的Debian環(huán)境中使用著名的性能測(cè)試工具UnixBench在空載的情況下運(yùn)行Unixbench 5.1.2可執(zhí)行文件,Unixbench使用GCC 10.2.1進(jìn)行編譯,測(cè)試結(jié)果如下所示。
在KVM虛擬機(jī)中,在Ubuntu Server 20.04中同樣使用UnixBench 5.1.2進(jìn)行測(cè)試,測(cè)試結(jié)果如下所示。
根據(jù)測(cè)試結(jié)果得知,虛擬化技術(shù)在便攜式設(shè)備常用的ARMV8指令集平臺(tái)上完全可行,且性能逼近實(shí)機(jī)運(yùn)行的速率,是一個(gè)完全能夠用于實(shí)際生產(chǎn)環(huán)境中的技術(shù),而且在開(kāi)啟Secure Boot功能的設(shè)備上,性能也能完全不受為規(guī)避Secure Boot多出的啟動(dòng)流程的影響,也為未來(lái)對(duì)市面上的產(chǎn)品進(jìn)行再回收與二次開(kāi)發(fā)提供了可能。
四、總結(jié)與展望
虛擬化技術(shù)作為許多云計(jì)算與數(shù)據(jù)中心的核心技術(shù),在X86平臺(tái)上已經(jīng)發(fā)展成為較為成熟的技術(shù)之一,主要用于服務(wù)器的批量管理,將服務(wù)器集群所能提供的物理資源轉(zhuǎn)換成可被重復(fù)劃分的邏輯資源,提高了服務(wù)器的利用效率。
在ARM64平臺(tái)上,虛擬化技術(shù)不僅能實(shí)現(xiàn)傳統(tǒng)X86架構(gòu)上對(duì)物理資源的靈活劃分,還能利用RISC指令集帶來(lái)的低功耗優(yōu)勢(shì),在更低的功耗下實(shí)現(xiàn)相同的任務(wù)。另外基于ARM64平臺(tái)的芯片其成本要遠(yuǎn)遠(yuǎn)低于傳統(tǒng)的基于X86指令集的芯片,甚至也可以使用回收的ARM便攜設(shè)備組成服務(wù)器集群來(lái)提供云計(jì)算等服務(wù),這項(xiàng)技術(shù)的普及也將大大減少服務(wù)提供商的搭建成本和維護(hù)成本,降低了搭建數(shù)據(jù)中心的門(mén)檻也推進(jìn)了廢舊電子產(chǎn)品的重復(fù)利用。
在面向最終用戶的市場(chǎng)中,本文闡述的技術(shù)也起著十分重要的作用。通過(guò)對(duì)硬件的完全虛擬而性能又貼近實(shí)機(jī)運(yùn)行速度的特性也可以將用戶使用的應(yīng)用程序的運(yùn)行環(huán)境與外部的操作系統(tǒng)完全隔離開(kāi)來(lái),降低了有害應(yīng)用對(duì)設(shè)備造成影響的可能性。另外也能通過(guò)該項(xiàng)技術(shù)完善基于Linux技術(shù)的國(guó)產(chǎn)操作系統(tǒng)對(duì)于為Windows與Android設(shè)計(jì)的應(yīng)用程序的兼容性,應(yīng)用生態(tài)處于發(fā)展中的操作系統(tǒng)也可以利用該技術(shù)迅速建立應(yīng)用生態(tài)。另外基于KVM技術(shù)構(gòu)建的虛擬機(jī)間接通過(guò)模擬硬件為所有在虛擬機(jī)運(yùn)行的應(yīng)用程序提供了統(tǒng)一的運(yùn)行環(huán)境,大大減少了ARM指令集不同平臺(tái)普遍存在的差異性與碎片化。
參考文獻(xiàn):
[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)分析.易學(xué)教程[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.