3. 虚拟化技术入门
在SA8155这类车载高性能计算平台上,虚拟化不是“锦上添花”,而是把仪表、座舱、ADAS、T-Box等多个安全等级不同的系统塞进同一颗SoC的前提。理解Hypervisor的类型、ARM的异常级别模型以及Stage-2翻译机制,是后续做隔离与安全域划分的底层基础。
一、Hypervisor的两大类型:Type-1与Type-2
Hypervisor(虚拟机监视器,VMM)的核心职责是:创建并调度虚拟机、拦截敏感指令、隔离资源、提供虚拟设备。按运行位置可分为两类:
- Type-1(裸机型 / Native):直接运行在硬件之上,自身即是最底层的系统软件,如Xen、KVM(在ARM上以EL2形态存在)、Jailhouse、QNX Hypervisor。它不需要宿主操作系统,延迟低、可控性强,是车载与工业场景的主流选择。
- Type-2(宿主型 / Hosted):运行在通用操作系统之上,如VirtualBox、VMware Workstation、QEMU(纯用户态模式)。依赖宿主OS的调度与驱动,部署方便但实时性和隔离性较弱,多用于开发调试。
需要澄清一个常见误区:KVM在x86上表现为内核模块,常被误认为Type-2;但在ARM上,KVM利用EL2直接承载Guest,本质是Type-1。判断类型应看“谁直接控制硬件虚拟化扩展”,而不是看代码放在哪个内核里。
二、ARM虚拟化扩展与EL2异常级别
ARMv8-A引入四个异常级别(Exception Level),权限从高到低为EL0~EL3:
| 异常级别 | 典型软件 | 作用 |
|---|---|---|
| EL0 | 用户应用 | 最低权限,无系统寄存器访问 |
| EL1 | Guest OS内核 / Host OS内核 | 管理页表、中断、驱动 |
| EL2 | Hypervisor | 虚拟化控制、Stage-2翻译、vGIC、vTimer |
| EL3 | Secure Monitor | 安全世界与非安全世界切换(TrustZone) |
EL2是虚拟化的“控制平面”。当Guest在EL1执行敏感操作(如写TTBR、访问ICC寄存器、执行WFI)时,会触发陷入(trap)到EL2,由Hypervisor决定是模拟、转发还是拒绝。SA8155的座舱与仪表虚拟机正是通过EL2被统一纳管。
三、Stage-2翻译:两阶段地址转换
ARM虚拟化的精髓在于两阶段地址翻译:
- Stage-1:由Guest OS在EL1配置,把Guest虚拟地址(VA)翻译为Guest物理地址(IPA)。Guest以为自己掌控了内存。
- Stage-2:由Hypervisor在EL2配置,把IPA再翻译为真实物理地址(PA)。这一步Guest完全不可见,也无法绕过。
因此,Hypervisor只需维护Stage-2页表,就能实现内存隔离、地址重映射、设备直通(MMIO映射)。两个Guest即使IPA相同,经Stage-2后也会落到不同PA,天然互不可见。这也是“隔离”二字的硬件根基。
四、典型场景:SA8155上的座舱与仪表隔离
在SA8155工程实践中,常见做法是:QNX Hypervisor运行在EL2,承载两个Guest——仪表VM(QNX,高安全等级)和座舱VM(Android,丰富生态)。两者各自在EL1维护Stage-1页表,Hypervisor用Stage-2把它们的IPA映射到物理内存的不同区域,并通过vGIC分发中断、通过vTimer提供虚拟时钟。仪表VM的显示缓冲区对座舱VM完全不可见,即使Android被攻破,也无法读写仪表内存。
// Hypervisor 为 VM2 建立 Stage-2 映射
// IPA 0x0000_0000 -> PA 0x9000_0000 (1GB)
stage2_map(vm2, ipa=0x00000000, pa=0x90000000,
size=0x40000000, attr=RW|Normal|NonSecure);
// 设备 MMIO 直通
stage2_map(vm2, ipa=0x0C000000, pa=0x0C000000,
size=0x01000000, attr=RW|Device|NonSecure);
五、常见误区与复盘
- 误区一:把KVM一律当Type-2。在ARM上KVM运行于EL2,直接控制硬件虚拟化,属于Type-1形态。
- 误区二:认为Guest能感知Stage-2。Guest只能看到IPA,Stage-2对Guest完全透明,这也是隔离可信的关键。
- 误区三:忽略EL3与TrustZone的配合。安全世界与非安全世界的切换由EL3的Secure Monitor完成,虚拟化隔离与安全域隔离是两层不同机制,需协同设计。
- 复盘要点:先确认Hypervisor运行级别(EL2),再检查Stage-2页表是否覆盖所有Guest内存与MMIO,最后验证中断与时钟虚拟化路径是否完整。