郭熒炎 韋淼 楊嘉豪 李哲宇 吳亞軍





摘 要:本文旨在說明普通的便攜式移動平臺(例如智能手機)上實現并運行基于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.