3. Jailhouse 架构总览

Jailhouse 是一个基于 Linux 的静态分区 Hypervisor,它的设计哲学与 KVM、Xen 等通用虚拟化方案截然不同:不追求动态调度与资源超卖,而是把物理硬件“切”成若干互不干扰的分区,让每个分区独占 CPU 核、内存区域和外设,从而获得接近裸机的确定性与实时性。理解 Jailhouse,关键要抓住六个对象:Hypervisor 核心、Root Cell、Non-root Cell、inmate、管理接口,以及它们共同依赖的启动流程与内存布局。

一、核心原理:静态分区的“切分”模型

Jailhouse 在系统启动后由 Linux 加载,加载完成后 Linux 本身被“降级”为 Root Cell,而 Hypervisor 核心则运行在最高特权级,负责 CPU 核的分配、内存隔离和中断路由。它并不模拟设备,也不提供完整的虚拟化抽象,而是把物理资源直接分配给各个 Cell。每个 Cell 看到的都是真实的硬件地址与真实的中断号,因此 inmate 的代码可以极简,甚至不需要操作系统。

这种“静态分区”意味着:Cell 的配置在创建时确定,运行期间不能随意增删 CPU 或内存。这既是限制,也是它低开销、低延迟的根源。Jailhouse 的核心职责可以概括为三件事:隔离(内存与中断)、路由(中断与通信)、控制(Cell 生命周期)。

二、架构对象与职责

下面这张图展示了 Jailhouse 的整体架构关系:Hypervisor 核心位于最底层,Root Cell 与 Non-root Cell 并列运行在其上,管理接口负责下发配置,inmate 则是 Non-root Cell 中运行的轻量负载。

Jailhouse Hypervisor 核心 CPU 核分配 · 内存隔离 · 中断路由 · Cell 生命周期控制 Root Cell(Linux) 管理 Cell · 拥有全部硬件视图 加载 Hypervisor · 创建/销毁 Cell 提供 jailhouse 工具与 sysfs 接口 运行标准 Linux 应用与驱动 Non-root Cell 独占分配的 CPU 核与内存区域 直接访问分配的外设 MMIO / IRQ 与 Root Cell 通过 ivshmem 通信 可运行 inmate 或完整 OS Inmate 裸机程序 / 轻量 RTOS / 实时任务 管理接口 jailhouse enable / cell create / cell load ivshmem 物理内存:Hypervisor 保留区 | Root Cell 区 | Non-root Cell 区(静态划分,互不重叠)

从图中可以看出,Root Cell 是唯一拥有完整硬件视图的 Cell,它负责“管理”而非“计算”。Non-root Cell 则是被切分出来的独立分区,inmate 运行在其中。管理接口是用户态与 Hypervisor 之间的桥梁,所有 Cell 的创建、加载、启动、销毁都通过它完成。

三、启动流程:从 Linux 到分区系统

Jailhouse 的启动不是从 BIOS 开始,而是在 Linux 已经正常运行之后“二次启动”。典型流程如下:

  1. 编译与安装:在目标平台编译 jailhouse.ko 与用户态工具,安装到 Root Cell 的 Linux 中。
  2. 加载内核模块:执行 modprobe jailhouse,模块初始化时申请保留内存、接管 CPU 热插拔与中断控制。
  3. 启用 Hypervisor:执行 jailhouse enable configs/<platform>.cell,Linux 被降级为 Root Cell,Hypervisor 核心开始运行。
  4. 创建 Non-root Cell:执行 jailhouse cell create configs/<cell>.cell,Hypervisor 按配置划分 CPU、内存与外设。
  5. 加载 inmate 镜像:执行 jailhouse cell load <cell> image.bin,将 inmate 代码写入目标 Cell 的内存。
  6. 启动 Cell:执行 jailhouse cell start <cell>,目标 CPU 核从指定入口开始执行 inmate。
# 典型启动命令序列
modprobe jailhouse
jailhouse enable configs/qemu-arm64.cell
jailhouse cell create configs/rtos-arm64.cell
jailhouse cell load rtos-arm64 inmate.bin
jailhouse cell start rtos-arm64

# 查看当前 Cell 状态
jailhouse cell list
jailhouse cell stats rtos-arm64
启动顺序不可颠倒:必须先 enable Hypervisor,再 create Cell,最后 load 并 start。若在 Root Cell 尚未降级时直接 create,会因 Hypervisor 未就绪而失败。

四、内存布局:静态划分的边界

Jailhouse 的内存布局是理解隔离机制的关键。系统物理内存被划分为三个互不重叠的区域:

区域 归属 用途 是否可被 inmate 访问
Hypervisor 保留区 Hypervisor 核心 存放核心代码、页表、Cell 配置、通信缓冲区 否
Root Cell 区 Root Cell(Linux) Linux 内核、驱动、用户态进程、管理工具 否
Non-root Cell 区 各 Non-root Cell inmate 代码、数据、栈、共享内存 仅本 Cell 可访问

每个 Cell 的配置文件中通过 memory_regions 字段声明其物理内存范围。Hypervisor 在创建 Cell 时建立第二级页表,把该范围映射给目标 CPU 核,其他区域一律不可见。这种“白名单”式映射是隔离的硬件基础。

常见误区:认为 Non-root Cell 可以像虚拟机一样动态申请内存。实际上 Jailhouse 不支持内存热插拔或动态扩展,Cell 创建后内存边界即固定。若 inmate 越界访问,会触发 Hypervisor 的异常处理,通常导致该 Cell 被挂起或销毁。

五、案例场景:工业实时控制中的分区部署

假设一台 ARM64 工业网关需要同时运行 Linux 人机界面和硬实时运动控制任务。采用 Jailhouse 后,部署方式如下:

  • CPU0–CPU1 分配给 Root Cell,运行 Linux、网络协议栈和 Web HMI。
  • CPU2–CPU3 分配给 Non-root Cell,运行裸机 inmate,直接控制 EtherCAT 从站。
  • EtherCAT MAC 与定时器通过配置直接分配给 Non-root Cell,中断不经过 Linux。
  • HMI 与控制任务之间通过 ivshmem 共享内存交换指令与状态,避免网络栈抖动。

这样,Linux 侧的负载波动、驱动延迟、内核调度都不会影响控制任务的周期精度。inmate 的循环可以稳定在微秒级抖动,而 Root Cell 仍然保留完整的调试与运维能力。

六、复盘:架构理解中的三个关键点

  1. Root Cell 不是“特权虚拟机”:它只是被 Hypervisor 管理的第一个 Cell,权限来自配置而非架构地位。Hypervisor 核心才是真正的最高特权层。
  2. inmate 不是“进程”:它没有 Linux 进程上下文,不依赖调度器,入口地址和栈由 Cell 配置指定,本质是一段在指定 CPU 核上裸跑的代码。
  3. 管理接口是唯一入口:所有 Cell 操作都必须通过 jailhouse 工具或 sysfs 接口完成,直接操作硬件寄存器会破坏 Hypervisor 的隔离假设。

把 Hypervisor 核心、Root Cell、Non-root Cell、inmate、管理接口、启动流程与内存布局这七个要素串起来,Jailhouse 的架构图景就完整了:一个极简的静态分区层,把复杂 Linux 与确定性实时任务放在同一颗芯片上,各得其所,互不干扰。