服務器和桌面機虛擬化一直占據有相當大的版面,隨著云計算和存儲的興起,虛擬化技術更 被熱捧,還有一種虛擬化技術發展迅猛--嵌入式虛擬化。嵌入式虛擬化是指嵌入式系統中部署虛擬機監控程序。盡管嵌入式設備一直受到嚴格的資源限制,但今天 的設備范圍廣泛--從擁有服務器級功能(比如對虛擬化的硬件支持)的強大處理器到擁有計較少容量和資源的功耗優化系統。如果向嵌入式系統添加一個虛擬機監 控程序,將添加靈活性和一些高級功能,將嵌入式設備轉變為一種新型系統。
嵌入式領域包含幾個有用的虛擬化應用領域:移動設備、安全性內核和并發性嵌入式操作系統。本文介紹了智能終端中虛擬化技術的應用。
(一)虛擬化技術概述
虛擬化是指計算機軟件在一個虛擬的平臺上而不是真實的硬件平臺上運行。虛擬化技術可以 擴大硬件的容量,簡化軟件的重新配置過程。其中CPU的虛擬化可以單CPU模擬多CPU并行運行,允許一個平臺同時運行多個操作系統,并且應用程序可以在 相互獨立的空間內運行而互不影響。虛擬化技術在降低硬件成本的同時,還可以顯著提高系統的工作效率和安全性。
虛擬化系統的實現通常是在操作系統和硬件之間加入一個虛擬機監控程序,稱為 Hypervisor(如圖1所示)。由Hypervisor主要負責各個操作系統之間的硬件資源協調。虛擬機監控程序是一種特殊操作系統,直接在裸機上 運行(針對完全虛擬化技術)。虛擬機監控程序創建一個底層硬件平臺抽象,一個或多個虛擬機(VM)共享這個底層硬件平臺。在這種環境中,VM 只是操作系統及其應用程序的容器,一個 VM 與虛擬機監控程序上運行的其他 VMs 隔離,這支持多個操作系統或多個配置不同的相似操作系統。
圖1 虛擬化系統結構
智能終端虛擬化技術也是通過Hypervisor來實現多個操作系統的硬件資源共享。現有的虛擬化技術方案主要有VirtualLogix的VLX、Open Kernel Labs的OKL4等,這些技術方案雖然實現了不同的Hypervisor,但總體結構相似。
(二)智能終端領域的虛擬化
虛擬化技術使得軟件和硬件通過虛擬化技術實現了較松的耦合,系統軟件只需要實現很少的 改動就能移植到新的硬件平臺上。智能終端可以在虛擬平臺上運行多個相互隔離的操作系統,提高手機系統的安全性。如將重要數據和安全需求高的應用專門隔離保 護起來,即使某操作系統上的應用軟件甚至整個智能操作系統因中毒等崩潰,虛擬化技術可以將重要數據隔離保護起來。另外虛擬化技術還可能減少硬件成本,如果 一顆CPU計算能力足夠,可以在一顆CPU上模擬多顆邏輯CPU的執行,將智能操作系統和基帶的RTOS運行在同一個CPU上,減少主芯片數量,節約大量 成本。多核平臺中也可以通過將CPUs虛擬成虛擬CPU池,所有軟件部分都通過虛擬化技術共享這些硬件資源。
如果虛擬化技術在嵌入式領域高度發展,應該可以實現軟硬件的極松耦合--所有軟件(操作系統,WIFi、藍牙等微控制程序)共享硬件平臺、運行在虛擬硬件層,邏輯硬件間形成統一的邏輯接口,硬件平臺支持方便的替換、升級。那時,智能終端將可任意定制。
(三)ARM架構上基于OKL4的Android虛擬化OKL4是Open Kernel Labs公司的一款虛擬化產品,作為針對嵌入式系統的Hypervisor,OKL4支持經過虛擬化處理的操作系統(包括智能操作系統和RTOS),一些 操作系統的內核組件也進行虛擬化處理,獨立運行在OKL4的輕量級執行環境下。OKL4既支持粗粒度的操作系統虛擬機,又支持細粒度的輕量級執行環境。驅 動程序或文件系統等內核組件可直接運行在輕量級執行環境中,其它子系統可以共享該組件,提高了系統的安全性,也提高代碼的復用率。基于OKL4的手機虛擬 化結構如圖2所示。
圖2 OKL4虛擬化系統結構
虛擬機VMM(虛擬機監控器)運行在物理CPU的最高特權級,對物理資源虛擬的三個主要任務:處理器虛擬化、內存虛擬化和I/O虛擬化。本節通過CPU虛擬化、內存虛擬化介紹ARM架構上基于OKL4的虛擬化Android。
1,CPU虛擬化的設計
OKL4 Hypervisor運行在特權級(6 種特權模式)上,負責管理CPU資源,負責虛擬機的調度和切換,而輕量級執行環境和虛擬機均位于用戶模式下,使用OKL4提供的IPC機制進行通信。
在基于OKL4的虛擬化Android系統中,當Android試圖訪問CPU寄存器 時,該請求不會真正發生在物理寄存器上,相反,OKL4會將訪問定位到“虛擬寄存器”。根據不同的處理器體系結構,OKL4定義了一套存放在內存中的“虛 擬寄存器”,這些虛擬寄存器作為線程的本地變量位于線程的用戶線程控制塊中。通過“虛擬寄存器”,Android不會訪問到真實的物理資源,從而實現了操 作系統與CPU資源的隔離。
2,虛擬內存管理
在OKL4虛擬化系統中,Android操作系統使用的內存地址空間其實是OKL4建 立的虛擬地址空間,是由一些物理內存映射而生成的虛擬內存。在OKL4 Hypervisor啟動時,一個稱為__okl4_environ的全局變量會被初始化,__okl4_environ的成員 okl4_virtmem_item為一個結構體數組,它代表了各個虛擬化子系統(包括操作系統和虛擬化組件)的虛擬內存地址空間。子系統可以通過 OKL4提供的接口OKL4_ENV_GET_ STATIC()訪問該結構體數組,獲取虛擬內存地址。