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 中运行的轻量负载。
从图中可以看出,Root Cell 是唯一拥有完整硬件视图的 Cell,它负责“管理”而非“计算”。Non-root Cell 则是被切分出来的独立分区,inmate 运行在其中。管理接口是用户态与 Hypervisor 之间的桥梁,所有 Cell 的创建、加载、启动、销毁都通过它完成。
三、启动流程:从 Linux 到分区系统
Jailhouse 的启动不是从 BIOS 开始,而是在 Linux 已经正常运行之后“二次启动”。典型流程如下:
- 编译与安装:在目标平台编译 jailhouse.ko 与用户态工具,安装到 Root Cell 的 Linux 中。
- 加载内核模块:执行
modprobe jailhouse,模块初始化时申请保留内存、接管 CPU 热插拔与中断控制。 - 启用 Hypervisor:执行
jailhouse enable configs/<platform>.cell,Linux 被降级为 Root Cell,Hypervisor 核心开始运行。 - 创建 Non-root Cell:执行
jailhouse cell create configs/<cell>.cell,Hypervisor 按配置划分 CPU、内存与外设。 - 加载 inmate 镜像:执行
jailhouse cell load <cell> image.bin,将 inmate 代码写入目标 Cell 的内存。 - 启动 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
四、内存布局:静态划分的边界
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 核,其他区域一律不可见。这种“白名单”式映射是隔离的硬件基础。
五、案例场景:工业实时控制中的分区部署
假设一台 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 仍然保留完整的调试与运维能力。
六、复盘:架构理解中的三个关键点
- Root Cell 不是“特权虚拟机”:它只是被 Hypervisor 管理的第一个 Cell,权限来自配置而非架构地位。Hypervisor 核心才是真正的最高特权层。
- inmate 不是“进程”:它没有 Linux 进程上下文,不依赖调度器,入口地址和栈由 Cell 配置指定,本质是一段在指定 CPU 核上裸跑的代码。
- 管理接口是唯一入口:所有 Cell 操作都必须通过 jailhouse 工具或 sysfs 接口完成,直接操作硬件寄存器会破坏 Hypervisor 的隔离假设。
把 Hypervisor 核心、Root Cell、Non-root Cell、inmate、管理接口、启动流程与内存布局这七个要素串起来,Jailhouse 的架构图景就完整了:一个极简的静态分区层,把复杂 Linux 与确定性实时任务放在同一颗芯片上,各得其所,互不干扰。