3. 多OS虚拟化架构总览

在嵌入式系统中引入多OS虚拟化,核心目标是在一颗SoC上同时运行多个操作系统,并让它们按需共享CPU、内存、外设与中断资源。要做到这一点,必须回答四个问题:谁来仲裁硬件、仲裁者自身如何组织、多个OS之间如何协同、整个系统如何分层。本节围绕这四个问题建立总体认知框架。

一、Hypervisor的两种基本类型

Hypervisor(虚拟机监视器,VMM)是虚拟化架构的中枢。按它与硬件的相对位置,通常分为Type 1与Type 2两类。

  • Type 1(裸机型):Hypervisor直接运行在硬件之上,拥有最高特权级,直接管理中断控制器、MMU、时钟和外设。客户OS运行在其上,特权指令被陷入并由Hypervisor模拟。嵌入式场景中,Type 1是主流选择,因为它对实时性、启动时间和资源开销的控制最直接。
  • Type 2(宿主型):Hypervisor作为宿主OS上的一个进程或内核模块运行,依赖宿主OS提供驱动与调度。部署方便,但多了一层调度与中断转发,确定性和隔离性较弱,多用于开发验证或非实时场景。

在嵌入式领域还存在一种折中形态:混合型/分区型Hypervisor,它不提供完整的设备模型,而是把物理设备按“分区”静态分配给各客户OS,仅对CPU和内存做强隔离。这类方案在汽车域控制器和工业控制中非常常见,因为其时间行为可预测。

二、虚拟机监视器的内部结构

无论哪种类型,VMM内部通常由若干功能模块构成,理解这些模块有助于后续配置与排障:

  • vCPU调度器:把物理CPU时间片分配给各客户OS的虚拟CPU,决定谁在何时运行。
  • 内存管理单元:通过Stage-2页表(ARM)或EPT(x86)实现客户物理地址到机器物理地址的二次映射,保证隔离。
  • 中断虚拟化模块:借助GICv3/v4的虚拟中断或vGIC,把物理中断注入到正确的客户OS。
  • 设备模型/直通模块:决定外设是模拟、半虚拟化还是直接分配(Passthrough)。
  • 通信与共享内存服务:为跨OS消息传递提供通道与共享缓冲区。
关键认识:Hypervisor不是“更高级的操作系统”,它更像一个资源仲裁层。它越薄,确定性和可验证性越好;它越厚,功能越丰富但开销与故障面越大。

三、多OS协同模型

多个客户OS之间并非彼此孤立,它们需要协同完成一个整机功能。常见的协同模型有三类:

  1. 主从模型(Master–Slave):一个OS作为控制主核,负责系统管理、人机交互与网络;另一个OS作为实时从核,只处理确定性任务。两者通过共享内存与中断通信。该模型结构清晰,适合仪表+实时控制的组合。
  2. 对等模型(Peer-to-Peer):各OS地位平等,通过标准化的跨核通信中间件(如RPMsg、OpenAMP)交换数据。灵活但需要更严格的资源约定与协议设计。
  3. 服务分区模型(Partitioned):按功能把系统切成若干静态分区,每个分区独占CPU核、内存段和外设,分区之间几乎不共享。该模型隔离性最强,适合安全等级不同的功能共存。

协同的落地依赖三样东西:共享内存区、核间中断(IPI)和通信协议。共享内存负责搬运数据,IPI负责通知对方“数据已就绪”,协议负责定义消息格式与同步语义。三者缺一不可。

四、系统分层视图

把上述内容整合起来,一个典型的多OS虚拟化系统可划分为五层:硬件层、Hypervisor层、虚拟化服务层、客户OS层和应用层。下面的SVG给出了这一分层结构以及层间的关键接口与数据通路。

应用层 实时控制任务 | 人机交互 | 网络服务 | 安全监控 客户OS层 RTOS(实时核) Linux(通用核) 安全OS / Bare-metal 虚拟化服务层 共享内存管理 | 核间中断IPI | RPMsg/OpenAMP | 设备直通与模拟 | 时钟同步 Hypervisor 层(VMM) vCPU调度器 Stage-2 内存映射 vGIC 中断虚拟化 设备仲裁 硬件层 多核CPU | MMU/SMMU | GIC | 定时器 | DMA | 外设控制器 上层依赖下层提供的抽象;下层通过陷入与仲裁约束上层行为

五、典型场景与配置示例

以“Linux + RTOS”双核异构为例,常见做法是把Cortex-A核交给Linux,Cortex-M或R核交给RTOS,Hypervisor负责启动顺序与资源划分。启动参数通常需要显式声明各客户OS的内存区域与CPU亲和性:

# 典型分区配置片段(示意)
partition rtos {
    cpus = <0x2>;              # 绑定到CPU2
    memory = <0x80000000 0x2000000>;  # 32MB
    entry = <0x80010000>;
    compatible = "openamp,remote";
};

partition linux {
    cpus = <0x0 0x1>;
    memory = <0x82000000 0x1E000000>;
    entry = <0x82080000>;
};

配置完成后,可通过Hypervisor提供的控制台查看分区状态与中断统计,用于确认隔离是否生效:

hypctl list
# ID   NAME     STATE    CPU    MEM
# 0    linux    running  0,1    480MB
# 1    rtos     running  2      32MB

hypctl irqstat 1
# IPI_TX: 1024   IPI_RX: 1023   VIRQ_INJ: 512

六、常见误区与复盘要点

误区一:把Hypervisor当成普通驱动。它运行在最高特权级,任何缺陷都可能破坏全局隔离,必须按可信基(TCB)对待,代码量与接口面要严格控制。

误区二:认为“分了核就没有共享”。即使CPU核独立,缓存、内存带宽、DMA和中断控制器仍是共享资源,仍可能产生干扰,需要带宽与延迟预算。

误区三:忽略启动顺序与时钟同步。多OS启动存在先后依赖,若从核先于主核初始化共享内存,通信会失败;跨OS时间戳不一致也会导致日志与故障分析失真。

复盘时建议按“隔离是否成立、通信是否可靠、时间是否可预测、故障是否可定位”四条主线逐项检查。下表给出分层视角下的检查清单:

层次 关键对象 检查要点
硬件层 MMU/SMMU、GIC、DMA 地址映射是否隔离、中断路由是否正确、DMA是否越界
Hypervisor层 vCPU调度、Stage-2页表、vGIC 时间片是否公平、陷入开销是否可接受、虚拟中断是否丢失
虚拟化服务层 共享内存、IPI、RPMsg 缓冲区是否对齐、通知是否可靠、协议版本是否一致
客户OS层 驱动、调度器、时钟源 是否使用虚拟设备、是否感知到被虚拟化、时钟是否同步
应用层 实时任务、通信中间件 端到端延迟是否达标、异常时是否有降级路径

总体而言,多OS虚拟化架构的设计本质是在“隔离、性能、功能、可验证性”之间做权衡。Type 1分区型方案偏向隔离与确定性,Type 2与富设备模型偏向功能与兼容性;协同模型决定OS之间如何交换信息,分层结构决定每一层应承担的责任边界。把这张总体图建立起来,后续的CPU虚拟化、内存虚拟化、中断虚拟化与设备虚拟化才有明确的落点。