服务器和桌面机虚拟化一直占据有相当大的版面,随着云计算和存储的兴起,虚拟化技术更被热捧,还有一种虚拟化技术发展迅猛--嵌入式虚拟化。嵌入式虚拟化是指嵌入式系统中部署虚拟机监控程序。尽管嵌入式设备一直受到严格的资源限制,但今天的设备范围广泛--从拥有服务器级功能(比如对虚拟化的硬件支持)的强大处理器到拥有计较少容量和资源的功耗优化系统。如果向嵌入式系统添加一个虚拟机监控程序,将添加灵活性和一些高级功能,将嵌入式设备转变为一种新型系统。
嵌入式领域包含几个有用的虚拟化应用领域:移动设备、安全性内核和并发性嵌入式操作系统。本文介绍了智能终端中虚拟化技术的应用。
(一)虚拟化技术概述
虚拟化是指计算机软件在一个虚拟的平台上而不是真实的硬件平台上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。其中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()访问该结构体数组,获取虚拟内存地址。