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 先启动,再把自己降级”。这个顺序是理解其架构的关键。
- 系统正常启动 Linux,加载
jailhouse.ko内核模块。 - 执行
jailhouse enable,Hypervisor 核心被加载到预留内存,CPU 核切换到 EL2/VMX root。 - root cell 被“冻结”并重新映射,成为受 Hypervisor 管理的第一个 cell。
- 通过
cell create按配置文件切分 CPU、内存和中断,生成 inmate cell 的空壳。 - 通过
cell load把 inmate 镜像写入其私有内存区域。 - 通过
cell start让目标 CPU 核从 inmate 入口开始执行,分区正式运行。
四、系统组成与资源映射关系
下表总结了各组成部分的职责、特权级和典型资源,便于建立整体认知。
| 组成部分 | 运行特权级 | 核心职责 | 典型资源 |
|---|---|---|---|
| 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 的架构并不复杂,复杂的是资源切分时必须精确到每一个核、每一段内存和每一个中断号。