3. Jailhouse 架构概览

Jailhouse 是一个基于 Linux 的静态分区 Hypervisor,它的设计哲学与 KVM、Xen 等通用虚拟化方案截然不同:不追求动态调度与资源超卖,而是把物理 CPU 核、内存区域、中断控制器和 PCI 设备在启动时“一次性切分”给若干互不干扰的分区。理解 Jailhouse 的第一步,就是看清它的系统组成与启动流程——谁在什么时候、以什么身份、把哪些资源交给了谁。

一、核心组成:Hypervisor 核心与两类 Cell

Jailhouse 运行时只有三个角色:Hypervisor 核心、root cell 和 inmate cell。它们不是并列的进程,而是有严格层级关系的执行环境。

  • Hypervisor 核心(jailhouse.bin):一段极小的裸机代码,运行在最高特权级(EL2 或 VMX root),负责 CPU 核的进入/退出、内存隔离、中断路由和 hypercall 处理。它不包含调度器,也不管理设备驱动,代码量通常在数万行级别。
  • root cell:即启动 Jailhouse 的那个 Linux 系统本身。它被“降级”为一个特权分区,仍然拥有大部分设备和驱动,但必须通过管理接口把资源让渡给 inmate。root cell 是唯一能创建、销毁 cell 的分区。
  • inmate cell:被切分出来的非 root 分区,可以运行裸机程序(bare-metal inmate)或另一份精简 Linux(Linux inmate)。inmate 只能看到分配给自己的 CPU 核、内存和中断,无法访问 root cell 的资源。

三者关系可以用一句话概括:Hypervisor 核心是“裁判”,root cell 是“资源管理员”,inmate 是“被隔离的租户”。裁判不参与业务,管理员负责分配,租户之间互不可见。

二、管理接口:jailhouse 工具与 sysfs

用户态通过 jailhouse 命令行工具与内核模块 jailhouse.ko 交互,最终以 hypercall 形式进入 Hypervisor 核心。常用操作包括使能、创建 cell、加载 inmate、销毁 cell 和查看状态。

# 使能 Jailhouse(root cell 降级,Hypervisor 接管)
jailhouse enable /path/to/qemu-arm64.cell

# 创建一个 inmate cell
jailhouse cell create /path/to/inmate-demo.cell

# 加载 inmate 镜像到指定 cell
jailhouse cell load inmate-demo /path/to/inmate.bin

# 启动 inmate
jailhouse cell start inmate-demo

# 查看当前 cell 与 CPU 分配
jailhouse cell list
jailhouse cell stat inmate-demo

其中 .cell 配置文件是资源切分的“合同”,用 C 语法描述 CPU 集合、内存区域、中断号和 PCI 设备。它决定了 inmate 能看到什么,也决定了 root cell 必须放弃什么。

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

Jailhouse 的启动不是“先有 Hypervisor 再启动 Linux”,而是“Linux 先启动,再把自己降级”。这个顺序是理解其架构的关键。

  1. 系统正常启动 Linux,加载 jailhouse.ko 内核模块。
  2. 执行 jailhouse enable,Hypervisor 核心被加载到预留内存,CPU 核切换到 EL2/VMX root。
  3. root cell 被“冻结”并重新映射,成为受 Hypervisor 管理的第一个 cell。
  4. 通过 cell create 按配置文件切分 CPU、内存和中断,生成 inmate cell 的空壳。
  5. 通过 cell load 把 inmate 镜像写入其私有内存区域。
  6. 通过 cell start 让目标 CPU 核从 inmate 入口开始执行,分区正式运行。
关键点:Jailhouse 的资源切分是静态的。cell 创建后,CPU 核和内存区域不再动态迁移,这也是它能做到低延迟、高确定性的根本原因。

四、系统组成与资源映射关系

下表总结了各组成部分的职责、特权级和典型资源,便于建立整体认知。

组成部分 运行特权级 核心职责 典型资源
Hypervisor 核心 EL2 / VMX root CPU 进入退出、内存隔离、中断路由、hypercall 预留内存、系统寄存器
root cell EL1 / VMX non-root 设备驱动、cell 管理、资源让渡 大部分外设、管理 CPU
inmate cell EL1 / VMX non-root 运行业务负载或实时任务 专属 CPU 核、私有内存、指定中断
jailhouse 工具 用户态 下发管理命令、加载配置 sysfs、/dev/jailhouse

五、典型场景:工业控制中的双分区

假设一台 ARM64 工控机有 4 个 CPU 核。root cell 运行 Linux,负责网络、日志和人机界面;inmate 运行一个裸机实时控制程序。配置文件中把 CPU 3 划给 inmate,并分配一段 64MB 物理内存和一个定时器中断。启动后,CPU 3 不再被 Linux 调度,inmate 的抖动可以控制在微秒级,而 Linux 侧的负载波动完全不会影响它。这就是 Jailhouse “以隔离换确定性”的典型价值。

六、常见误区与复盘

误区一:把 Jailhouse 当成 KVM 使用。Jailhouse 没有动态调度和资源超卖,不能像 KVM 那样随意创建大量虚拟机。它的 cell 数量在启动时基本确定。

误区二:认为 root cell 可以随意访问 inmate 内存。一旦 cell 创建,Hypervisor 会用第二阶段地址翻译隔离内存,root cell 也不能越界访问。

误区三:忽略配置文件与硬件的一致性。如果 .cell 中声明的 CPU 或内存与真实硬件不符,cell create 会失败,甚至导致系统不稳定。复盘时应先核对设备树、CPU ID 和内存保留区域。

掌握 Hypervisor 核心、root cell、inmate 三者的层级关系,以及“Linux 先启动、再降级、后切分”的启动顺序,是后续理解 CPU 隔离和内存隔离机制的基础。Jailhouse 的架构并不复杂,复杂的是资源切分时必须精确到每一个核、每一段内存和每一个中断号。

Jailhouse 系统组成与启动流程 Hypervisor 核心 EL2 / VMX root · 内存隔离 · 中断路由 · hypercall root cell(Linux) 设备驱动 · 管理接口 · 资源让渡 CPU 0-2 · 大部分外设 jailhouse.ko + jailhouse 工具 inmate cell 裸机程序 / 精简 Linux CPU 3 · 私有内存 64MB 指定定时器中断 管理 / 降级 创建 / 加载 / 启动 启动流程 Linux 启动 enable 降级 cell create cell load cell start 静态切分:CPU 核、内存区域、中断号在 cell 创建时确定,运行期不再迁移