3. Jailhouse 架构解析

Jailhouse 是一种基于 Linux 的静态分区虚拟化方案,它并不像 KVM 那样把 Linux 变成通用 Hypervisor,而是把一颗多核 SoC 划分为若干彼此隔离的“单元”(Cell),其中一个为管理 Linux 的 Root Cell,其余为运行裸机或实时系统的 Inmate Cell。理解 Jailhouse 的架构,是后续移植与故障诊断的基础。

一、核心组件与整体结构

Jailhouse 由内核模块 jailhouse.ko、用户态工具 jailhouse、配置单元 .cell 文件以及固件/引导辅助代码组成。内核模块负责 CPU 隔离、内存保留、中断重映射与设备直通;用户态工具负责加载配置、创建和销毁 Cell;.cell 文件以二进制格式描述每个 Cell 的 CPU 集合、内存区域、中断号和 PCI 设备。

系统启动后,Root Cell 中的 Linux 通过 jailhouse enable 激活 Hypervisor,随后用 jailhouse cell create 创建 Inmate Cell,再用 jailhouse cell load 加载镜像并启动。整个过程是静态的:Cell 的 CPU、内存、中断和设备在创建前就已确定,运行期不再动态分配。

Jailhouse 静态分区架构与启动数据流 用户态工具 jailhouse enable / disable cell create cell load cell start .cell 配置 内核模块 jailhouse.ko CPU 隔离 · 内存保留 · 中断重映射 · 设备直通 · Hypercall 接口 Root Cell(Linux) CPU0-1 · 管理内存 · 原生驱动 负责创建/销毁 Inmate Cell 通过 /dev/jailhouse 下发命令 Inmate Cell(裸机/RTOS) CPU2-3 · 独占内存 · 直通设备 无 Linux 依赖,直接访问硬件 通过 IVC 与 Root Cell 通信 IVC

二、启动流程与 CPU 虚拟化

Jailhouse 的启动分为三个阶段。第一阶段是 Linux 正常启动并加载 jailhouse.ko,此时 Hypervisor 尚未激活;第二阶段执行 jailhouse enable rootcell.cell,内核模块将 Hypervisor 镜像复制到预留内存,把非 Root Cell 的 CPU 从 Linux 中剥离并置于等待状态,然后跳转到 Hypervisor 入口;第三阶段由 Root Cell 创建 Inmate Cell,Hypervisor 为每个 Cell 建立独立的 CPU 上下文和页表。

CPU 虚拟化采用“静态分区”而非“时间片复用”。每个物理 CPU 在某一时刻只属于一个 Cell,Hypervisor 通过 struct cell 和 struct per_cpu 记录 CPU 归属。当 Inmate Cell 运行时,Hypervisor 运行在 EL2(ARM64)或 VMX root(x86),Guest 运行在 EL1/VMX non-root。CPU 切换由 arch_cpu_switch 完成,保存/恢复通用寄存器、系统寄存器和向量表基址。

# 典型启动命令序列
sudo modprobe jailhouse
sudo jailhouse enable /path/to/rootcell.cell
sudo jailhouse cell create /path/to/inmate.cell
sudo jailhouse cell load inmate /path/to/inmate.bin
sudo jailhouse cell start inmate

# 查看 Cell 状态
sudo jailhouse cell list
sudo jailhouse cell stat inmate

三、内存管理与中断控制器

Jailhouse 的内存管理核心是“预留 + 映射”。在 jailhouse enable 之前,必须通过内核命令行 memmap= 或设备树 /reserved-memory 预留一段物理内存,避免 Linux 分配器使用。Hypervisor 激活后,Root Cell 只能访问自己的内存区域,Inmate Cell 的内存由 .cell 文件中的 mem_regions 指定,Hypervisor 为每个 Cell 建立独立的 stage-2 页表,实现物理地址隔离。

中断控制器方面,Jailhouse 对 GIC(ARM)或 IOAPIC(x86)进行分区。每个中断号在 .cell 中通过 irqchip 配置归属:Root Cell 保留管理中断,Inmate Cell 获得直通设备的中断。Hypervisor 拦截中断注入路径,根据中断号查表转发到对应 Cell,避免跨 Cell 中断干扰。对于需要低延迟的场景,可将中断直接注入 Inmate Cell,减少 Root Cell 转发开销。

机制 管理对象 关键配置 故障诊断要点
CPU 分区 物理 CPU 归属 cpus 字段 检查 CPU 是否被 Linux 占用
内存隔离 物理内存区域 mem_regions 确认预留内存未被覆盖
中断重映射 IRQ 归属 irqchip 查看中断是否被错误路由
设备直通 PCI/MMIO 设备 pci_devices 验证 IOMMU 与 BAR 映射

四、设备直通机制与典型场景

设备直通是 Jailhouse 实现实时性的关键。它把某个 PCI 设备或 MMIO 设备从 Root Cell 中解绑,交给 Inmate Cell 独占使用。配置时需要在 .cell 中声明设备的 BDF、BAR 空间和中断号,Hypervisor 会将该设备的 MMIO 区域映射到 Inmate Cell 的 stage-2 页表,并把中断直接注入。对于不支持 IOMMU 的平台,需要确保设备不进行 DMA 越界访问,否则会破坏其他 Cell 的内存。

典型场景:工业控制中,Root Cell 运行 Linux 负责人机界面和网络,Inmate Cell 运行 RTOS 控制电机。通过直通 EtherCAT 网卡和定时器,Inmate Cell 可获得微秒级抖动,而 Linux 侧的负载波动不会影响控制环路。

五、常见误区与复盘

  • 误区一:认为 Jailhouse 可以动态创建任意 Cell。实际上 Cell 的 CPU、内存、中断必须在配置阶段确定,运行期无法热添加。
  • 误区二:忽略内存预留,导致 Linux 分配器把 Inmate Cell 的内存分配给普通进程,引发随机崩溃。
  • 误区三:设备直通时未隔离 IOMMU 组,导致 DMA 重映射失败或设备无法访问。
  • 复盘建议:移植时先验证 Root Cell 能否正常 enable,再逐步添加 Inmate Cell;每次只增加一个变量,并用 jailhouse cell stat 和串口日志定位问题。

调试阶段务必保留串口输出。Jailhouse 崩溃时往往不会触发 Linux oops,而是直接停在 Hypervisor 异常处理中,只有串口日志能给出 CPU、异常向量和 Cell ID 等关键线索。

总体而言,Jailhouse 的架构可以概括为“静态分区、独立页表、中断归属、设备独占”。掌握这四条主线,就能在移植和故障诊断中快速判断问题位于配置层、Hypervisor 层还是硬件层。