陳宇,曾 顏,張先勇
(1.武漢郵電科學研究院,湖北武漢 430000;2.烽火通信科技股份有限公司,湖北 武漢 430000)
嵌入式設備[1-3]的研發中需要大量設備,場地和成本的限制,對產品的交付時間和質量影響較大。為了減少這種因素的影響,設計一種虛擬化設備供其使用。目前,嵌入式領域的虛擬化技術[4-5]常用的有QEMU、SIMICS、DOCKER 等。QEMU 是一種開源虛擬化技術,具有跨平臺、高速度、可移植等優點。因此QEMU 適合作為該文所要設計的虛擬化設備,同時利用KVM 對其性能加速。在使用QEMU 進行模擬時,代碼復雜,涉及到各個模塊的模擬實現,對嵌入式產品設備所用到的一些復雜功能硬件等的訪問模擬也是復雜的。設計出嵌入式產品虛擬化設備[6-8]有利于推動未來嵌入式行業的提升。
嵌入式系統一般是指由硬件和軟件組成的能夠自己獨立進行運作的設備。嵌入式系統中軟件內容包括軟件運行環境及其操作系統,硬件內容包括信號處理器、存儲器、通信模塊等有形可見的內容[9]。嵌入式系統是一種特殊的計算機系統,可以根據自己的需求靈活選擇必要的軟件或硬件模塊。它是以應用為導向,以現代計算機技術為基礎,再加上用戶需求去變化。通常一個嵌入式系統本身就是一個功能齊全的個體,是幾乎不需要依賴其他外部裝置就可獨立去運行的軟硬件組合起來的系統[10]。嵌入式的靈活多樣,用戶的需求也是不斷變化,因此就需要引入虛擬化技術到嵌入式系統中來。
虛擬化在計算機方面通常是指計算元件在虛擬的基礎上而不是真實的基礎上運行,是在一定的宿主機上模擬出來能實現一定功能的技術。虛擬化技術的本質在于對計算機系統軟硬件資源的劃分和抽象。目前,常用的虛擬化技術主要分為硬件仿真技術、全虛擬化技術、半虛擬化技術、硬件輔助虛擬化等,該文要在嵌入式系統中采用虛擬化技術設計嵌入式虛擬化設備,采用的則是硬件仿真技術,該技術在宿主機操作系統上創建一個硬件VM 來仿真所想要的硬件,包括客戶機需要的CPU 指令集和各種外設等[11-13]。該文所要使用的QEMU 虛擬化平臺[14-15]是一種典型硬件仿真技術虛擬機產品,但是由于使用VM 來模擬所需要的硬件速度會非常慢,所以使用KVM 加速技術[16-17]為仿真平臺性能加速。
QEMU 是目前廣為流行的開源虛擬化技術,具有跨平臺、高速度、可移植等優點,QEMU 作為主機上的VMM(Virtual Machine Monitor),通過動態二進制轉換來模擬CPU 處理器,并提供一系列的硬件模型。QEMU 本質上是宿主機操作系統上的一個應用程序,通過提取GUEST 操作系統的二進制代碼并翻譯成TCG 中間代碼,再將TCG 中間代碼翻譯成HOST 對應架構的機器代碼進行執行。QEMU 虛擬化技術,會使GUEST 自身不感知操作系統運行于QEMU 虛擬化環境還是物理環境。QEMU 開源代碼處于不斷演進的過程中,支持多種CPU 核的指令集模擬,以ARM v8 架構為例,目前支持cortex-A57、cortex-A53 和cortex-A72 三種ARM 核的模擬;此外,每種架構下都支持多種較為完善的處理器模擬,以及豐富的外設模擬。對于不支持的處理器,也可基于相應的CPU 核模擬,自主構建處理器級別的硬件模擬。
KVM(Kernel-based Virtual Machine)即基于內核的虛擬機,是一種內建于Linux 中的開源虛擬化技術,可以幫助用戶將Linux 切換到虛擬機監控模式(EL2),使宿主機硬件能夠同時運行多個隔離的虛擬環境,即虛擬機(VM)。但是KVM 缺少設備相關的虛擬化以及相應的用戶空間管理虛擬機的手段,因此完整的虛擬機系統構建需要借助QEMU 的相關功能。KVM 是同構虛擬化中非常流行的硬件加速技術,由于代碼不需要經過翻譯轉換而是直接運行于宿主機的物理CPU 核中,因此虛擬機的CPU 性能可以接近甚至高于對應物理機的性能。不過,借助于QEMU 模擬的IO 設備性能,相比物理設備依舊會有一定程度的下降。
該文所要設計的虛擬化設備,其硬件環境需要ARM v8 架構的Linux 服務器作為宿主機,其中CPU核數不少于16,硬盤容量不低于500 GB,物理內存不低于32 GB。在軟件環境方面,設備仿真平臺主要分為處理器平臺仿真、硬件適配和環境部署三個方面。其中需要模擬的主控設備采用的是LS1046處理器,處理器的仿真采用QEMU 虛擬化技術。QEMU 的開發與運行都是基于宿主機Linux 系統環境進行的,其中Linux 系統內核版本建議不低于3.10,該次開發使用的是開源的QEMU 源碼,源碼版本為3.1.0-rc4。硬件適配采用重定位共享庫技術,共享庫運行在操作系統中,接口庫封裝Linux 操作系統的交叉編譯環境。環境部署主要包含虛擬仿真設備的部署與全系統的網絡拓撲搭建,設備的部署采用shell 腳本實現;而網絡拓撲一部分屬于處理器仿真,通過QEMU 實現;另一部分位于HOST 環境,需基于bridge-utils 搭建虛擬網橋環境。
整個設備仿真平臺架構如圖1 所示。

圖1 設備仿真平臺架構
該框架主要分為HOST 硬件平臺、HOST 軟件系統、QEMU 硬件模擬和GUEST 軟件系統四個層次。
1)HOST 硬件平臺層
該層對于設備仿真平臺而言主要提供CPU 和內存模擬的物理資源,其中CPU 核數、CPU 主頻以及內存大小三方面硬件資源基本決定了設備仿真平臺的整體性能。
2)HOST 軟件系統層
宿主機的操作系統在設備仿真平臺中主要拆分為兩方面的功能:KVM 驅動是保障設備仿真平臺性能的核心,實現CPU 和內存的硬件加速;虛擬交換子系統則是設備仿真平臺網絡功能的基礎,支撐設備仿真平臺操作系統內部與外部物理環境網絡通信以及仿真設備之間的網絡通信功能。
3)QEMU 模擬硬件層
這一層負責模擬設備仿真平臺中的硬件單元,主要分為模擬CPU、虛擬內存以及IO 設備三大部分,具體硬件單元的劃分與物理設備一一對應。該層主要服務于GUEST 軟件系統中的內核部分,使內核不感知是運行于實際物理設備還是虛擬仿真設備中,是設備仿真平臺最核心的部分。
4)GUEST 軟件系統層
該層是設備仿真平臺的軟件運行層,按功能垂直劃分,最下層運行的是設備仿真平臺的內核軟件,負責與硬件的交互;內核之上運行根文件系統,提供用戶程序的運行環境;最上層就是體現虛擬設備主體功能的應用層軟件。
設備仿真平臺的QEMU 模擬硬件模塊架構主要分三個層面:
1)最外層為MACHINE,可對應于物理機處理器級別,包含LS1046 處理器與相關外部設備,如內存、網口設備、PCIe-PCI 橋、外部SATA 卡存儲和CPLD等,此外還有ARM 架構的啟動引導單元。
2)中間層為SOC,可對應于LS1046 處理器,包含四個Coretex-A72 ARM 核、中斷控制器、串口控制器、PCIe 控制器、SATA 控制器以及CCSR 部分系統控制單元等。
3)最內層則為各具體硬件模塊,這部分主要是實現硬件單元的地址空間讀寫訪問、中斷控制及相關功能邏輯的模擬。
上述QEMU 硬件模擬只覆蓋到處理器級別,如果是針對單盤級的外圍硬件,則需要在GUEST 軟件系統層進行模擬,通過重定位共享庫對設備中主控軟件運行過程執行的硬件初始化函數以及硬件功能函數進行處理,屏蔽后續的硬件操作而直接返回適配和數據仿真結果。
設備仿真平臺的QEMU 模擬硬件模塊架構如圖2 所示。

圖2 仿真平臺QEMU模擬硬件模塊架構
硬件功能的仿真主要是在仿真平臺GUEST 軟件系統層中完成的,用來實現處理器外圍硬件功能的模擬,從而使應用層獲得一些仿真數據。
仿真庫框架采用分層開放結構,仿真庫整體框架如圖3 所示。

圖3 仿真庫框架
SIMU &適配層提供雙向映射,一方面提供了實際硬件驅動接口的樁函數,通過指定虛擬設備功能調用虛擬設備統一適配層接口,該接口映射到虛擬設備功能Python 腳本來訪問虛擬硬件;另一方面提供了適配層回調函數,當底層硬件有告警或消息上送時,觸發回調函數通知適配層處理。通過動態鏈接庫可以實現SIMU&適配層的功能。
仿真庫SIMU 由虛擬驅動統一適配層、虛擬硬件接口層和虛擬硬件層三部分組成。
1)虛擬驅動統一適配層包括虛擬驅動接口動態庫(simuDrv.so)、硬件功能映射表、回調功能映射表、定時器表、網絡線程表和網絡映射表,其中simuDrv.so提供C 調用Python 的統一接口,通過配置硬件功能映射表定制虛擬硬件,simuDrv.so 加載時,啟動輪詢線程,定時觸發Python 腳本定時器,周期性檢查回調功能映射表,讀取虛擬硬件狀態或消息觸發回調,根據網絡線程表啟動收包線程,檢查網絡映射表處理收報并觸發回調。
2)虛擬硬件接口層提供了硬件功能接口的通用Python 腳本,通過統一硬件接口映射到虛擬硬件,統一硬件接口simuDemo.py 提供了通用的功能,實現了對虛擬硬件文件數據的讀寫功能,覆蓋了大部分硬件使用場景;simuSocket.py 基于simuDemo.py 派生了網絡收發報文接口;如果需要額外的功能,可以根據需要從統一硬件接口派生特性硬件接口,Python 腳本支持生成線程,定制復雜場景,可以充分利用Python 的靈活性。
3)虛擬硬件層是由一系列仿真硬件的數據文件組成,與虛擬設備統一適配層中硬件功能映射表對應,這些數據文件按照內存格式存放數據,通過虛擬硬件接口層Python 接口訪問,一般為讀寫操作。具有較復雜功能的硬件,可以在虛擬硬件接口層Python 中實現復雜的邏輯,模擬硬件動作。
仿真庫文件目錄下包括simuDrv.so 和基本配置config.ini、Python腳本庫script、虛擬設備文件目錄simu。
1)simuDrv.so 是虛擬驅動接口層動態庫,提供了C 調用Python 統一接口,會給上層應用提供一些虛擬硬件讀寫、調試以及注冊接口,simuDrv.so 會讀取config.ini中Python環境參數和定時器輪詢周期參數。
2)script中,虛擬硬件功能映射表用于C、Python、虛擬硬件數據文件綁定,利用虛擬功能列表和其對應的硬件地址方便上層應用操作虛擬硬件數據文件以及讀取數據匹配地址和平行調用讀寫;虛擬硬件回調配置文件用回調映射表處理一些需要回調的函數;網絡線程配置一般需要與回調配置聯合起來使用,如收到報文后觸發回調,其中有匹配硬件功能表和回調功能鍵值;網絡應用端口配置文件用于Python 接收、發送報文或者服務鏈調用時轉發處理等的配置;定時器配置表中的Python 腳本在定時器超時時觸發調用;simuParam.py 提供了上述配置獲取接口,simuDrv.so 通過調用simuParam.py 中的API函數獲取配置信息,從而實現相關映射;虛擬硬件接口層通用接口,提供演示功能,其他定制功能可據此派生,simuSocket.py 通過simuDemo.py 派生了網絡收發操作。
3)虛擬設備文件庫simu 中存放虛擬設備數據文件,需要與script 中虛擬硬件功能映射表中的硬件功能是一致的。
在虛擬驅動適配層增加溫度芯片功能映射(read)和風扇芯片功能映射(read/write),同時在虛擬硬件層增加溫度芯片和風扇芯片對應的數據文件,編輯溫度芯片數據文件,應用層就可以讀取到仿真設備當前的溫度,計算風扇檔位,對風扇升、降檔。為了仿真設備溫度的變化,可以在驅動適配層注冊溫度曲線回調,周期性改變溫度數據。
通過實驗得出以下結果:
1)實驗在搭建的虛擬平臺的服務器下啟動虛擬機,在同一個虛擬環境下可以同時拉起不同的虛擬設備,并且CPU 處理器和內存的模擬都可以實現。
2)虛擬設備運行圖如圖4 所示,其內容描述是其中一個虛擬設備進程起來以后相關功能的初始化成功打印。目前,可以實現的功能是CPU 的映射、相關文件的讀取、邏輯器件的文件下載以及可以識別虛擬設備的具體類型等;同時還可以使用gdb 調試工具對問題進行診斷。

圖4 虛擬設備運行圖
3)虛擬設備中主控設備和普通業務設備都可以成功上網管。設備上網管以后就可以方便測試研發對其進行業務方面的處理,其中還可以收到設備告警上報相關內容,便于對設備的監控。
該文設計與實現了一種基于QEMU 虛擬平臺的嵌入式虛擬化設備,可實現虛擬平臺的運行,且虛擬設備完成一些基礎功能,方便了測試和研發工作人員在設備研發過程中的調測。該設備也能使上層應用開發脫離硬件去做業務,使軟硬件實現一定程度的解耦合。但是目前對于一些特殊功能芯片的硬件虛擬化,可能無法實現,只能以上層預想達到的結果作為返回,以實現具體的業務功能。
由于軟件處于不斷演化的過程,硬件接口函數會出現變化,重定位共享庫可能無法適配新版本軟件,導致硬件仿真出錯。所以需要各模塊協同,以完善軟件架構,標準化硬件初始化和訪問接口。