2. 虚拟化与分区基础

在进入 Jailhouse Cell 的具体配置之前,必须先厘清一个根本问题:Jailhouse 并不是传统意义上的虚拟机监控器,而是一种静态分区(Static Partitioning)方案。理解它与 Type-1、Type-2 虚拟化的差异,是掌握后续 Cell 配置、资源分配与实时性保障的前提。

一、虚拟化的三种基本形态

从资源抽象方式看,虚拟化通常分为三类:

  • 全虚拟化:Guest 操作系统无需修改,由 Hypervisor 通过二进制翻译或硬件辅助(Intel VT-x、AMD-V)捕获敏感指令。KVM、VMware ESXi 属于此类。
  • 半虚拟化:Guest 需修改内核,主动调用 Hypervisor 提供的 hypercall 接口,典型如 Xen PV 模式。
  • 静态分区:不虚拟化 CPU 指令,而是把物理 CPU 核、内存区域、外设直接“切分”给不同分区,各分区运行原生操作系统或裸机程序,Hypervisor 只负责隔离与启动。Jailhouse 正是这一形态。

静态分区的关键特征是“配置在启动前确定,运行期不再动态调度”。这与 KVM 按时间片调度 vCPU 的方式有本质区别。

二、Type-1 与 Type-2 对比

Type-1(裸机型)Hypervisor 直接运行在硬件上,如 Xen、ESXi、Jailhouse;Type-2(宿主型)运行在宿主操作系统之上,如 VirtualBox、VMware Workstation。二者在实时性与隔离性上的差异,直接决定了工业场景的选型。

对比维度 Type-1 裸机型 Type-2 宿主型
运行位置直接位于硬件之上宿主 OS 的应用层
调度路径短,Hypervisor 直接调度长,需经宿主 OS 调度器
实时性抖动小,可做到微秒级抖动大,受宿主负载影响
隔离性强,硬件级隔离弱,共享宿主内核资源
典型代表Xen、ESXi、JailhouseVirtualBox、QEMU/KVM 用户态
适用场景工业控制、车载、实时系统开发测试、桌面虚拟化

需要特别指出:KVM 本身是内核模块,属于 Type-1 的变体,但其 Guest 仍通过 QEMU 用户态进程运行,调度路径并不短。Jailhouse 则更进一步——它甚至不调度,而是让每个分区独占物理核。

三、静态分区与实时性、隔离性

Jailhouse 的静态分区模型可以概括为“一个 Root Cell + 若干 Non-root Cell”。Root Cell 是 Linux,负责管理硬件并创建其他 Cell;Non-root Cell 可以是裸机程序、RTOS 或另一个 Linux。每个 Cell 被分配固定的 CPU 核、内存区域和 PCI 设备。

核心机制:Jailhouse 通过 CPU 的硬件虚拟化扩展(VT-x/VMX 或 ARM HVC)建立“第二层地址翻译”,但不介入运行期调度。每个 Cell 的 vCPU 与物理核一一绑定,运行期间不会被抢占。

这种设计带来两个直接收益:

  • 实时性:由于没有 Hypervisor 调度介入,分区内任务的响应延迟仅取决于其自身操作系统和硬件中断,抖动可控制在微秒级。对于需要周期性控制的场景(如电机控制、EtherCAT 主站),这是关键。
  • 隔离性:内存通过 EPT/Stage-2 页表隔离,外设通过 IOMMU 隔离。一个 Cell 崩溃不会影响其他 Cell,Root Cell 的 Linux 死机也不会波及 Non-root Cell。

下图展示了 Jailhouse 静态分区的典型结构:Root Cell 管理全局资源,两个 Non-root Cell 分别独占 CPU 核与外设,彼此通过共享内存通信。

Jailhouse 静态分区结构 Root Cell(Linux) 职责:硬件初始化、Cell 创建/销毁、全局资源管理 CPU 0-1 内存 0x0000-0x3FFF PCI 设备(管理口) Jailhouse Hypervisor 接口 Non-root Cell A(RTOS) 实时控制任务,独占物理核 CPU 2(独占) 内存 0x4000-0x5FFF 外设:EtherCAT 网卡(IOMMU 隔离) Non-root Cell B(裸机程序) 专用数据处理,无操作系统 CPU 3(独占) 内存 0x6000-0x7FFF 外设:数据采集卡(IOMMU 隔离) 共享内存 硬件平台 CPU(4 核) | 内存 | IOMMU | 中断控制器 | PCIe 总线

四、Jailhouse 适用场景与常见误区

基于上述特性,Jailhouse 最适合以下场景:

  1. 工业实时控制:一个核跑 Linux 做 HMI 和网络通信,另一个核跑 RTOS 做毫秒级甚至微秒级闭环控制。
  2. 车载域控制器:仪表盘、娱乐系统与安全关键任务分区隔离,互不干扰。
  3. 混合关键性系统:同一 SoC 上同时运行高安全等级和低安全等级任务,通过静态分区满足认证要求。
  4. 裸机程序复用:已有裸机代码无需移植到 Linux,直接作为 Non-root Cell 运行。
常见误区一:认为 Jailhouse 可以像 KVM 一样动态创建和迁移虚拟机。实际上 Jailhouse 的 Cell 配置在启动时由 Root Cell 通过 jailhouse enable 加载,运行期不支持动态资源再分配。
常见误区二:认为静态分区不需要考虑 CPU 亲和性。恰恰相反,每个 Cell 的 vCPU 必须与物理核严格绑定,配置错误会导致启动失败或隔离失效。

下面是一个典型的 Jailhouse 配置片段,展示了 Cell A 的 CPU 与内存分配:

/* cell-a.c 配置片段 */
struct jailhouse_cell_desc cell_a = {
    .name = "RTOS-Cell",
    .cpu_set_size = 1,
    .cpu_set = { 0x04 },          /* 绑定到 CPU 2(bit2) */
    .num_memory_regions = 1,
    .memory_regions = {
        { .phys_start = 0x40000000,
          .size = 0x20000000,
          .flags = JAILHOUSE_MEM_READ |
                   JAILHOUSE_MEM_WRITE |
                   JAILHOUSE_MEM_EXECUTE }
    },
    .num_pci_devices = 1,
    .pci_devices = { { .type = JAILHOUSE_PCI_TYPE_DEVICE,
                       .domain = 0x0000,
                       .bdf = 0x0300 } }  /* EtherCAT 网卡 */
};

从配置中可以看到,CPU 集合、内存区域、PCI 设备都是显式声明的。这种“声明式”配置正是静态分区的核心——没有隐式共享,没有运行期协商,一切在启动前确定。

复盘建议:在部署 Jailhouse 前,先用 lscpu、lspci -nn、cat /proc/iomem 梳理物理资源,再规划每个 Cell 的 CPU 核、内存区间和外设 BDF。资源冲突是 Cell 启动失败的首要原因。

总结来说,Jailhouse 以静态分区换取确定性与强隔离,用“不调度”实现实时性。它不追求虚拟化的通用性,而是在混合关键性场景中提供一种更轻、更可控的隔离手段。理解这一点,后续的 Cell 配置与部署才能有的放矢。