4. 硬件资源分区与隔离

在嵌入式虚拟化平台量产交付中,Hypervisor 能否稳定运行,关键不在于“能不能把多个系统跑起来”,而在于资源是否被清晰分区、严格隔离、可审计回收。CPU 核隔离决定实时性上限,内存分区决定故障边界,外设直通决定功能可用性,中断隔离决定抖动水平,安全域划分则决定整车或整机的安全合规能力。本节围绕这五条主线,给出可落地的分区与隔离方法。

核心目标:让每个虚拟机(VM)在时间、空间、设备、中断四个维度上互不越界;任一 VM 崩溃、跑飞或遭受攻击,都不能影响其他域,尤其是安全域与实时域。

一、CPU 核隔离:从“共享调度”到“独占绑定”

CPU 核隔离的本质是把物理核划分为若干组,分别交给不同 VM 或 vCPU 独占使用,避免跨域争抢导致的调度抖动。量产平台通常采用三种粒度:

  • 静态独占:将物理核直接分配给某个 VM 的 vCPU,Hypervisor 不参与时间片轮转,适合实时域与安全域。
  • 半虚拟化共享:多个 vCPU 共享一组物理核,由 Hypervisor 调度,适合非实时的人机交互域。
  • 混合绑定:实时域独占 2 核,其余域共享剩余核,兼顾成本与确定性。

在设备树或 Hypervisor 配置中,通常通过 CPU 亲和性(affinity)与核掩码完成绑定。例如:

# 将 vCPU0/vCPU1 绑定到物理核 2、3
cpuset.cpus = "2-3"
taskset -pc 2-3 $(pidof vm_rt)

# Hypervisor 侧核分配示意
vm0 { vcpu0 = &cpu2; vcpu1 = &cpu3; }   // 实时域独占
vm1 { vcpu0 = &cpu0; vcpu1 = &cpu1; }   // 通用域共享

需要特别注意的是,隔离核必须同时从 Linux 宿主或管理域的调度器中移除,否则宿主仍会向这些核派发任务,导致“名义独占、实际争抢”。

二、内存分区:地址空间与物理页的双重隔离

内存分区包含两层:地址空间隔离与物理页隔离。前者依靠 Stage-2 页表(如 ARM 的 VTTBR_EL2)把每个 VM 的 IPA 映射到不同 PA 区间;后者依靠 Hypervisor 在启动时预留连续物理内存,禁止宿主分配器触碰。

量产中常见做法是:

  1. 在启动参数中预留大块 CMA 或 memmap 区域,例如 memmap=512M$0x80000000。
  2. 为每个 VM 分配固定基址与大小,形成互不重叠的物理窗口。
  3. 对安全域内存启用加密或完整性保护(如 TZASC、MPU、SMMU 旁路限制)。
  4. 配置内存超配策略:实时域禁止超配,通用域可有限超配。

内存隔离一旦出现重叠,轻则数据串扰,重则安全域被非安全域读写,属于量产红线问题,必须在集成阶段用地址审计工具逐项核对。

三、外设直通与中断隔离

外设直通(Passthrough)让 VM 直接访问物理设备寄存器与 DMA,从而获得接近原生的性能。但直通必须与 IOMMU/SMMU 配合,否则设备 DMA 可绕过 Stage-2 页表,直接破坏内存隔离。

典型直通对象包括:GPU、NPU、以太网控制器、CAN 控制器、存储控制器。中断隔离则要求:

  • 外设中断通过 GIC 的 ITS/LPI 或 SPI 路由到指定 vCPU,不广播到其他域。
  • 直通设备的中断必须由 Hypervisor 注入到对应 VM,避免宿主“截胡”。
  • 对共享中断源,采用中断亲和性与优先级分组,防止实时域被非实时中断拖累。
判断直通是否安全,先问三个问题:该设备是否有独立 SMMU 流 ID?其 DMA 窗口是否被限制在所属 VM 内存内?其中断是否只路由到该 VM?三问皆“是”,才可放行量产。

四、安全域划分方法

安全域划分不是简单“分 VM”,而是依据功能安全(ISO 26262 / IEC 61508)与信息安全(ISO 21434)要求,把系统划分为 QM、ASIL-A/B、ASIL-C/D 或安全/非安全域。划分原则如下:

维度安全域实时域通用域
CPU独占核 + 锁步可选独占核共享核
内存固定窗口 + 加密/ECC固定窗口可超配
外设最小直通 + SMMU 强约束必要直通虚拟化外设
中断高优先级独占确定性路由普通优先级
通信受控 IPC + 审计共享内存 + 通知标准 virtio

安全域与实时域之间应通过受控 IPC(如静态共享内存 + 事件通知)通信,禁止直接内存映射;安全域崩溃时,Hypervisor 应能触发降级或复位,而不影响实时域继续运行。

五、案例与常见误区

某座舱项目初期将仪表实时域与娱乐域共享同一组 CPU 核,仅靠优先级区分。结果娱乐域一次大内存拷贝导致仪表帧率抖动超过 16ms,触发功能安全告警。整改方案是:仪表域独占 2 核、预留 256MB 内存、GPU 直通并绑定 SMMU、中断走 LPI 独占路由;娱乐域使用剩余核与虚拟 GPU。整改后仪表最坏响应时间从 22ms 降至 6ms。

常见误区:① 只做 CPU 绑定,忘记把隔离核从宿主调度器摘除;② 直通设备未接 SMMU,DMA 可写穿安全域;③ 内存预留与宿主 CMA 重叠,运行期被回收;④ 中断未做亲和性,实时域被非实时中断反复打断;⑤ 安全域与通用域共用 virtio 队列,缺少审计与限流。

复盘时建议建立一张“资源分区矩阵”,逐项记录每个 VM 的核、内存窗口、直通设备、SMMU 流 ID、中断号与安全等级,并在每次版本迭代后自动比对,防止配置漂移。只有把分区与隔离做成可验证、可回归的工程约束,嵌入式虚拟化平台才具备量产交付的确定性。

硬件资源分区与隔离总览 Hypervisor / 安全监控层 Stage-2 页表 · vCPU 调度 · 中断注入 · SMMU 配置 · 资源审计 安全域 (ASIL-D) CPU:独占核 0-1 锁步 / ECC / 高优先级 内存:0x8000_0000 + 256M 加密窗口 / 不可超配 外设:CAN / 安全 MCU SMMU StreamID 0x10 中断:SPI 32-47 独占 GIC 高优先级组 实时域 (ASIL-B) CPU:独占核 2-3 无时间片轮转 内存:0x9000_0000 + 512M 固定窗口 / 禁止超配 外设:GPU / 显示控制器 SMMU StreamID 0x20 中断:LPI 独占路由 确定性延迟 < 1ms 通用域 (QM) CPU:共享核 4-7 Hypervisor 调度 内存:0xB000_0000 + 1G 可有限超配 外设:虚拟网卡 / virtio 后端受控代理 中断:普通优先级 可合并 / 可延迟 物理硬件:多核 SoC · 内存控制器 · SMMU/IOMMU · GIC · 外设总线 IPC virtio