陳宇,曾 顏,張先勇
(1.武漢郵電科學(xué)研究院,湖北武漢 430000;2.烽火通信科技股份有限公司,湖北 武漢 430000)
嵌入式設(shè)備[1-3]的研發(fā)中需要大量設(shè)備,場地和成本的限制,對產(chǎn)品的交付時間和質(zhì)量影響較大。為了減少這種因素的影響,設(shè)計一種虛擬化設(shè)備供其使用。目前,嵌入式領(lǐng)域的虛擬化技術(shù)[4-5]常用的有QEMU、SIMICS、DOCKER 等。QEMU 是一種開源虛擬化技術(shù),具有跨平臺、高速度、可移植等優(yōu)點。因此QEMU 適合作為該文所要設(shè)計的虛擬化設(shè)備,同時利用KVM 對其性能加速。在使用QEMU 進(jìn)行模擬時,代碼復(fù)雜,涉及到各個模塊的模擬實現(xiàn),對嵌入式產(chǎn)品設(shè)備所用到的一些復(fù)雜功能硬件等的訪問模擬也是復(fù)雜的。設(shè)計出嵌入式產(chǎn)品虛擬化設(shè)備[6-8]有利于推動未來嵌入式行業(yè)的提升。
嵌入式系統(tǒng)一般是指由硬件和軟件組成的能夠自己獨立進(jìn)行運作的設(shè)備。嵌入式系統(tǒng)中軟件內(nèi)容包括軟件運行環(huán)境及其操作系統(tǒng),硬件內(nèi)容包括信號處理器、存儲器、通信模塊等有形可見的內(nèi)容[9]。嵌入式系統(tǒng)是一種特殊的計算機(jī)系統(tǒng),可以根據(jù)自己的需求靈活選擇必要的軟件或硬件模塊。它是以應(yīng)用為導(dǎo)向,以現(xiàn)代計算機(jī)技術(shù)為基礎(chǔ),再加上用戶需求去變化。通常一個嵌入式系統(tǒng)本身就是一個功能齊全的個體,是幾乎不需要依賴其他外部裝置就可獨立去運行的軟硬件組合起來的系統(tǒng)[10]。嵌入式的靈活多樣,用戶的需求也是不斷變化,因此就需要引入虛擬化技術(shù)到嵌入式系統(tǒng)中來。
虛擬化在計算機(jī)方面通常是指計算元件在虛擬的基礎(chǔ)上而不是真實的基礎(chǔ)上運行,是在一定的宿主機(jī)上模擬出來能實現(xiàn)一定功能的技術(shù)。虛擬化技術(shù)的本質(zhì)在于對計算機(jī)系統(tǒng)軟硬件資源的劃分和抽象。目前,常用的虛擬化技術(shù)主要分為硬件仿真技術(shù)、全虛擬化技術(shù)、半虛擬化技術(shù)、硬件輔助虛擬化等,該文要在嵌入式系統(tǒng)中采用虛擬化技術(shù)設(shè)計嵌入式虛擬化設(shè)備,采用的則是硬件仿真技術(shù),該技術(shù)在宿主機(jī)操作系統(tǒng)上創(chuàng)建一個硬件VM 來仿真所想要的硬件,包括客戶機(jī)需要的CPU 指令集和各種外設(shè)等[11-13]。該文所要使用的QEMU 虛擬化平臺[14-15]是一種典型硬件仿真技術(shù)虛擬機(jī)產(chǎn)品,但是由于使用VM 來模擬所需要的硬件速度會非常慢,所以使用KVM 加速技術(shù)[16-17]為仿真平臺性能加速。
QEMU 是目前廣為流行的開源虛擬化技術(shù),具有跨平臺、高速度、可移植等優(yōu)點,QEMU 作為主機(jī)上的VMM(Virtual Machine Monitor),通過動態(tài)二進(jìn)制轉(zhuǎn)換來模擬CPU 處理器,并提供一系列的硬件模型。QEMU 本質(zhì)上是宿主機(jī)操作系統(tǒng)上的一個應(yīng)用程序,通過提取GUEST 操作系統(tǒng)的二進(jìn)制代碼并翻譯成TCG 中間代碼,再將TCG 中間代碼翻譯成HOST 對應(yīng)架構(gòu)的機(jī)器代碼進(jìn)行執(zhí)行。QEMU 虛擬化技術(shù),會使GUEST 自身不感知操作系統(tǒng)運行于QEMU 虛擬化環(huán)境還是物理環(huán)境。QEMU 開源代碼處于不斷演進(jìn)的過程中,支持多種CPU 核的指令集模擬,以ARM v8 架構(gòu)為例,目前支持cortex-A57、cortex-A53 和cortex-A72 三種ARM 核的模擬;此外,每種架構(gòu)下都支持多種較為完善的處理器模擬,以及豐富的外設(shè)模擬。對于不支持的處理器,也可基于相應(yīng)的CPU 核模擬,自主構(gòu)建處理器級別的硬件模擬。
KVM(Kernel-based Virtual Machine)即基于內(nèi)核的虛擬機(jī),是一種內(nèi)建于Linux 中的開源虛擬化技術(shù),可以幫助用戶將Linux 切換到虛擬機(jī)監(jiān)控模式(EL2),使宿主機(jī)硬件能夠同時運行多個隔離的虛擬環(huán)境,即虛擬機(jī)(VM)。但是KVM 缺少設(shè)備相關(guān)的虛擬化以及相應(yīng)的用戶空間管理虛擬機(jī)的手段,因此完整的虛擬機(jī)系統(tǒng)構(gòu)建需要借助QEMU 的相關(guān)功能。KVM 是同構(gòu)虛擬化中非常流行的硬件加速技術(shù),由于代碼不需要經(jīng)過翻譯轉(zhuǎn)換而是直接運行于宿主機(jī)的物理CPU 核中,因此虛擬機(jī)的CPU 性能可以接近甚至高于對應(yīng)物理機(jī)的性能。不過,借助于QEMU 模擬的IO 設(shè)備性能,相比物理設(shè)備依舊會有一定程度的下降。
該文所要設(shè)計的虛擬化設(shè)備,其硬件環(huán)境需要ARM v8 架構(gòu)的Linux 服務(wù)器作為宿主機(jī),其中CPU核數(shù)不少于16,硬盤容量不低于500 GB,物理內(nèi)存不低于32 GB。在軟件環(huán)境方面,設(shè)備仿真平臺主要分為處理器平臺仿真、硬件適配和環(huán)境部署三個方面。其中需要模擬的主控設(shè)備采用的是LS1046處理器,處理器的仿真采用QEMU 虛擬化技術(shù)。QEMU 的開發(fā)與運行都是基于宿主機(jī)Linux 系統(tǒng)環(huán)境進(jìn)行的,其中Linux 系統(tǒng)內(nèi)核版本建議不低于3.10,該次開發(fā)使用的是開源的QEMU 源碼,源碼版本為3.1.0-rc4。硬件適配采用重定位共享庫技術(shù),共享庫運行在操作系統(tǒng)中,接口庫封裝Linux 操作系統(tǒng)的交叉編譯環(huán)境。環(huán)境部署主要包含虛擬仿真設(shè)備的部署與全系統(tǒng)的網(wǎng)絡(luò)拓?fù)浯罱?,設(shè)備的部署采用shell 腳本實現(xiàn);而網(wǎng)絡(luò)拓?fù)湟徊糠謱儆谔幚砥鞣抡?,通過QEMU 實現(xiàn);另一部分位于HOST 環(huán)境,需基于bridge-utils 搭建虛擬網(wǎng)橋環(huán)境。
整個設(shè)備仿真平臺架構(gòu)如圖1 所示。
圖1 設(shè)備仿真平臺架構(gòu)
該框架主要分為HOST 硬件平臺、HOST 軟件系統(tǒng)、QEMU 硬件模擬和GUEST 軟件系統(tǒng)四個層次。
1)HOST 硬件平臺層
該層對于設(shè)備仿真平臺而言主要提供CPU 和內(nèi)存模擬的物理資源,其中CPU 核數(shù)、CPU 主頻以及內(nèi)存大小三方面硬件資源基本決定了設(shè)備仿真平臺的整體性能。
2)HOST 軟件系統(tǒng)層
宿主機(jī)的操作系統(tǒng)在設(shè)備仿真平臺中主要拆分為兩方面的功能:KVM 驅(qū)動是保障設(shè)備仿真平臺性能的核心,實現(xiàn)CPU 和內(nèi)存的硬件加速;虛擬交換子系統(tǒng)則是設(shè)備仿真平臺網(wǎng)絡(luò)功能的基礎(chǔ),支撐設(shè)備仿真平臺操作系統(tǒng)內(nèi)部與外部物理環(huán)境網(wǎng)絡(luò)通信以及仿真設(shè)備之間的網(wǎng)絡(luò)通信功能。
3)QEMU 模擬硬件層
這一層負(fù)責(zé)模擬設(shè)備仿真平臺中的硬件單元,主要分為模擬CPU、虛擬內(nèi)存以及IO 設(shè)備三大部分,具體硬件單元的劃分與物理設(shè)備一一對應(yīng)。該層主要服務(wù)于GUEST 軟件系統(tǒng)中的內(nèi)核部分,使內(nèi)核不感知是運行于實際物理設(shè)備還是虛擬仿真設(shè)備中,是設(shè)備仿真平臺最核心的部分。
4)GUEST 軟件系統(tǒng)層
該層是設(shè)備仿真平臺的軟件運行層,按功能垂直劃分,最下層運行的是設(shè)備仿真平臺的內(nèi)核軟件,負(fù)責(zé)與硬件的交互;內(nèi)核之上運行根文件系統(tǒng),提供用戶程序的運行環(huán)境;最上層就是體現(xiàn)虛擬設(shè)備主體功能的應(yīng)用層軟件。
設(shè)備仿真平臺的QEMU 模擬硬件模塊架構(gòu)主要分三個層面:
1)最外層為MACHINE,可對應(yīng)于物理機(jī)處理器級別,包含LS1046 處理器與相關(guān)外部設(shè)備,如內(nèi)存、網(wǎng)口設(shè)備、PCIe-PCI 橋、外部SATA 卡存儲和CPLD等,此外還有ARM 架構(gòu)的啟動引導(dǎo)單元。
2)中間層為SOC,可對應(yīng)于LS1046 處理器,包含四個Coretex-A72 ARM 核、中斷控制器、串口控制器、PCIe 控制器、SATA 控制器以及CCSR 部分系統(tǒng)控制單元等。
3)最內(nèi)層則為各具體硬件模塊,這部分主要是實現(xiàn)硬件單元的地址空間讀寫訪問、中斷控制及相關(guān)功能邏輯的模擬。
上述QEMU 硬件模擬只覆蓋到處理器級別,如果是針對單盤級的外圍硬件,則需要在GUEST 軟件系統(tǒng)層進(jìn)行模擬,通過重定位共享庫對設(shè)備中主控軟件運行過程執(zhí)行的硬件初始化函數(shù)以及硬件功能函數(shù)進(jìn)行處理,屏蔽后續(xù)的硬件操作而直接返回適配和數(shù)據(jù)仿真結(jié)果。
設(shè)備仿真平臺的QEMU 模擬硬件模塊架構(gòu)如圖2 所示。
圖2 仿真平臺QEMU模擬硬件模塊架構(gòu)
硬件功能的仿真主要是在仿真平臺GUEST 軟件系統(tǒng)層中完成的,用來實現(xiàn)處理器外圍硬件功能的模擬,從而使應(yīng)用層獲得一些仿真數(shù)據(jù)。
仿真庫框架采用分層開放結(jié)構(gòu),仿真庫整體框架如圖3 所示。
圖3 仿真庫框架
SIMU &適配層提供雙向映射,一方面提供了實際硬件驅(qū)動接口的樁函數(shù),通過指定虛擬設(shè)備功能調(diào)用虛擬設(shè)備統(tǒng)一適配層接口,該接口映射到虛擬設(shè)備功能Python 腳本來訪問虛擬硬件;另一方面提供了適配層回調(diào)函數(shù),當(dāng)?shù)讓佑布懈婢蛳⑸纤蜁r,觸發(fā)回調(diào)函數(shù)通知適配層處理。通過動態(tài)鏈接庫可以實現(xiàn)SIMU&適配層的功能。
仿真庫SIMU 由虛擬驅(qū)動統(tǒng)一適配層、虛擬硬件接口層和虛擬硬件層三部分組成。
1)虛擬驅(qū)動統(tǒng)一適配層包括虛擬驅(qū)動接口動態(tài)庫(simuDrv.so)、硬件功能映射表、回調(diào)功能映射表、定時器表、網(wǎng)絡(luò)線程表和網(wǎng)絡(luò)映射表,其中simuDrv.so提供C 調(diào)用Python 的統(tǒng)一接口,通過配置硬件功能映射表定制虛擬硬件,simuDrv.so 加載時,啟動輪詢線程,定時觸發(fā)Python 腳本定時器,周期性檢查回調(diào)功能映射表,讀取虛擬硬件狀態(tài)或消息觸發(fā)回調(diào),根據(jù)網(wǎng)絡(luò)線程表啟動收包線程,檢查網(wǎng)絡(luò)映射表處理收報并觸發(fā)回調(diào)。
2)虛擬硬件接口層提供了硬件功能接口的通用Python 腳本,通過統(tǒng)一硬件接口映射到虛擬硬件,統(tǒng)一硬件接口simuDemo.py 提供了通用的功能,實現(xiàn)了對虛擬硬件文件數(shù)據(jù)的讀寫功能,覆蓋了大部分硬件使用場景;simuSocket.py 基于simuDemo.py 派生了網(wǎng)絡(luò)收發(fā)報文接口;如果需要額外的功能,可以根據(jù)需要從統(tǒng)一硬件接口派生特性硬件接口,Python 腳本支持生成線程,定制復(fù)雜場景,可以充分利用Python 的靈活性。
3)虛擬硬件層是由一系列仿真硬件的數(shù)據(jù)文件組成,與虛擬設(shè)備統(tǒng)一適配層中硬件功能映射表對應(yīng),這些數(shù)據(jù)文件按照內(nèi)存格式存放數(shù)據(jù),通過虛擬硬件接口層Python 接口訪問,一般為讀寫操作。具有較復(fù)雜功能的硬件,可以在虛擬硬件接口層Python 中實現(xiàn)復(fù)雜的邏輯,模擬硬件動作。
仿真庫文件目錄下包括simuDrv.so 和基本配置config.ini、Python腳本庫script、虛擬設(shè)備文件目錄simu。
1)simuDrv.so 是虛擬驅(qū)動接口層動態(tài)庫,提供了C 調(diào)用Python 統(tǒng)一接口,會給上層應(yīng)用提供一些虛擬硬件讀寫、調(diào)試以及注冊接口,simuDrv.so 會讀取config.ini中Python環(huán)境參數(shù)和定時器輪詢周期參數(shù)。
2)script中,虛擬硬件功能映射表用于C、Python、虛擬硬件數(shù)據(jù)文件綁定,利用虛擬功能列表和其對應(yīng)的硬件地址方便上層應(yīng)用操作虛擬硬件數(shù)據(jù)文件以及讀取數(shù)據(jù)匹配地址和平行調(diào)用讀寫;虛擬硬件回調(diào)配置文件用回調(diào)映射表處理一些需要回調(diào)的函數(shù);網(wǎng)絡(luò)線程配置一般需要與回調(diào)配置聯(lián)合起來使用,如收到報文后觸發(fā)回調(diào),其中有匹配硬件功能表和回調(diào)功能鍵值;網(wǎng)絡(luò)應(yīng)用端口配置文件用于Python 接收、發(fā)送報文或者服務(wù)鏈調(diào)用時轉(zhuǎn)發(fā)處理等的配置;定時器配置表中的Python 腳本在定時器超時時觸發(fā)調(diào)用;simuParam.py 提供了上述配置獲取接口,simuDrv.so 通過調(diào)用simuParam.py 中的API函數(shù)獲取配置信息,從而實現(xiàn)相關(guān)映射;虛擬硬件接口層通用接口,提供演示功能,其他定制功能可據(jù)此派生,simuSocket.py 通過simuDemo.py 派生了網(wǎng)絡(luò)收發(fā)操作。
3)虛擬設(shè)備文件庫simu 中存放虛擬設(shè)備數(shù)據(jù)文件,需要與script 中虛擬硬件功能映射表中的硬件功能是一致的。
在虛擬驅(qū)動適配層增加溫度芯片功能映射(read)和風(fēng)扇芯片功能映射(read/write),同時在虛擬硬件層增加溫度芯片和風(fēng)扇芯片對應(yīng)的數(shù)據(jù)文件,編輯溫度芯片數(shù)據(jù)文件,應(yīng)用層就可以讀取到仿真設(shè)備當(dāng)前的溫度,計算風(fēng)扇檔位,對風(fēng)扇升、降檔。為了仿真設(shè)備溫度的變化,可以在驅(qū)動適配層注冊溫度曲線回調(diào),周期性改變溫度數(shù)據(jù)。
通過實驗得出以下結(jié)果:
1)實驗在搭建的虛擬平臺的服務(wù)器下啟動虛擬機(jī),在同一個虛擬環(huán)境下可以同時拉起不同的虛擬設(shè)備,并且CPU 處理器和內(nèi)存的模擬都可以實現(xiàn)。
2)虛擬設(shè)備運行圖如圖4 所示,其內(nèi)容描述是其中一個虛擬設(shè)備進(jìn)程起來以后相關(guān)功能的初始化成功打印。目前,可以實現(xiàn)的功能是CPU 的映射、相關(guān)文件的讀取、邏輯器件的文件下載以及可以識別虛擬設(shè)備的具體類型等;同時還可以使用gdb 調(diào)試工具對問題進(jìn)行診斷。
圖4 虛擬設(shè)備運行圖
3)虛擬設(shè)備中主控設(shè)備和普通業(yè)務(wù)設(shè)備都可以成功上網(wǎng)管。設(shè)備上網(wǎng)管以后就可以方便測試研發(fā)對其進(jìn)行業(yè)務(wù)方面的處理,其中還可以收到設(shè)備告警上報相關(guān)內(nèi)容,便于對設(shè)備的監(jiān)控。
該文設(shè)計與實現(xiàn)了一種基于QEMU 虛擬平臺的嵌入式虛擬化設(shè)備,可實現(xiàn)虛擬平臺的運行,且虛擬設(shè)備完成一些基礎(chǔ)功能,方便了測試和研發(fā)工作人員在設(shè)備研發(fā)過程中的調(diào)測。該設(shè)備也能使上層應(yīng)用開發(fā)脫離硬件去做業(yè)務(wù),使軟硬件實現(xiàn)一定程度的解耦合。但是目前對于一些特殊功能芯片的硬件虛擬化,可能無法實現(xiàn),只能以上層預(yù)想達(dá)到的結(jié)果作為返回,以實現(xiàn)具體的業(yè)務(wù)功能。
由于軟件處于不斷演化的過程,硬件接口函數(shù)會出現(xiàn)變化,重定位共享庫可能無法適配新版本軟件,導(dǎo)致硬件仿真出錯。所以需要各模塊協(xié)同,以完善軟件架構(gòu),標(biāo)準(zhǔn)化硬件初始化和訪問接口。