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用户应用最低权限,无系统寄存器访问
EL1Guest OS内核 / Host OS内核管理页表、中断、驱动
EL2Hypervisor虚拟化控制、Stage-2翻译、vGIC、vTimer
EL3Secure 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,天然互不可见。这也是“隔离”二字的硬件根基。

ARMv8 虚拟化:EL级别与两阶段地址翻译 EL0 Guest 应用 EL1 Guest OS 内核 EL2 Hypervisor EL3 Secure Monitor Stage-1 翻译 Guest 配置 (EL1) VA → IPA Guest 以为掌控内存 Stage-2 翻译 Hypervisor 配置 (EL2) IPA → PA Guest 不可见、不可绕过 IPA 物理内存 (PA) VM1 内存区 PA 0x8000_0000 VM2 内存区 PA 0x9000_0000 设备 MMIO 映射区 vGIC / vTimer / 直通设备 trap 关键点: ① Guest 的 VA→IPA 由 EL1 控制;② IPA→PA 由 EL2 的 Stage-2 页表强制决定; ③ 敏感指令陷入 EL2 处理;④ 相同 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被攻破,也无法读写仪表内存。

配置片段示例(Stage-2页表映射思路):
// 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,最后验证中断与时钟虚拟化路径是否完整。
工程提示:调试Stage-2问题时,优先确认IPA到PA的映射粒度(4KB/2MB/1GB)与属性(Normal/Device、RW/RO),错误的属性会导致Guest访问设备时出现难以定位的Data Abort。