4. Jailhouse架构

Jailhouse 是一个基于 Linux 的静态分区虚拟化方案,它并不像 KVM 那样把 Linux 当作被调度的客户机,而是把 Linux 本身“降级”为运行在 Hypervisor 之上的一个分区。理解 Jailhouse 的关键,是看清它由哪些层次组成、各层之间如何分工,以及系统从启动到分区建立经历了哪些阶段。

一、核心原理:四层结构与职责划分

Jailhouse 的整体架构可以概括为四个层次:Hypervisor 层、Root Cell、Non-root Cell 和 inmate。它们不是并列关系,而是自上而下的控制与承载关系。

  • Hypervisor 层:运行在 EL2(ARM)或 VMX root(x86)的最底层,代码量很小,负责 CPU 分区、内存隔离、中断路由和 hypercall 处理。它不参与设备驱动,也不做调度,只做“静态划分”。
  • Root Cell:即启动 Jailhouse 的那个 Linux 系统。它拥有全部硬件资源的管理权,负责创建、配置和销毁 Non-root Cell,是唯一能发起管理操作的“特权分区”。
  • Non-root Cell:由 Root Cell 划分出来的独立分区,拥有被分配的 CPU、内存和设备。它可以是另一个 Linux,也可以是一个裸机程序。
  • inmate:运行在 Non-root Cell 中的裸机镜像,通常是一个极小的实时任务或专用程序,不依赖操作系统,直接使用被分配的资源。

这种结构带来的最大特点是“静态”:分区在创建时资源就固定下来,运行期间不会动态迁移或抢占。因此 Jailhouse 的实时性和确定性远高于通用虚拟化方案,但灵活性较低。

Jailhouse 四层架构与通信路径 Hypervisor 层(EL2 / VMX root) CPU 分区 · 内存隔离 · 中断路由 · hypercall 处理 Root Cell(Linux) 管理分区 · 拥有全部硬件 jailhouse enable / cell create 负责设备初始化与资源划分 Non-root Cell 独立 CPU / 内存 / 设备 可运行 Linux 或裸机镜像 资源静态固定,运行期不迁移 inmate(裸机镜像) 无操作系统 · 直接访问分配资源 实时任务 / 专用程序 通信机制 hypercall · ivshmem 共享内存 虚拟中断 · 单向/双向消息 创建/配置 加载 建立通道 消息传递

二、通信机制:hypercall 与共享内存

分区之间不能直接访问彼此的内存,因此 Jailhouse 提供了两条主要通信路径。

第一条是 hypercall。Root Cell 通过 hypercall 请求 Hypervisor 执行管理操作,例如启用 Hypervisor、创建 Cell、销毁 Cell。这些调用由 Hypervisor 在 EL2 层处理,不会进入 Non-root Cell。

第二条是 ivshmem 共享内存。它允许 Root Cell 与 Non-root Cell 之间、或两个 Non-root Cell 之间建立共享内存区域,并通过虚拟中断通知对方。这种方式适合传递数据流,例如传感器采样值、控制指令或日志。

# Root Cell 中启用 Jailhouse
jailhouse enable /path/to/jailhouse-config.cell

# 创建 Non-root Cell
jailhouse cell create /path/to/nonroot.cell

# 加载 inmate 镜像
jailhouse cell load 1 /path/to/inmate.bin

# 启动 Cell
jailhouse cell start 1

需要注意的是,ivshmem 的共享内存区域必须在 Cell 配置文件中预先声明,运行期不能动态扩展。这与静态分区的整体设计一致。

三、系统启动流程

Jailhouse 的启动不是从固件直接进入 Hypervisor,而是由 Linux 主动“让位”。典型流程如下:

  1. 系统正常启动 Linux,加载 Jailhouse 内核模块。
  2. 执行 jailhouse enable,Hypervisor 被加载到 EL2,Linux 被降级为 Root Cell。
  3. Root Cell 解析 Cell 配置文件,确定 CPU、内存、中断和设备的划分。
  4. 执行 jailhouse cell create,Hypervisor 根据配置建立 Non-root Cell 的地址空间和 CPU 上下文。
  5. 通过 jailhouse cell load 将 inmate 镜像写入目标 Cell 的内存。
  6. 执行 jailhouse cell start,Non-root Cell 开始运行,inmate 获得 CPU 控制权。
启动顺序不可颠倒:必须先 enable Hypervisor,再 create Cell,最后 load 和 start。若在 Hypervisor 未启用时创建 Cell,命令会直接失败。

四、案例场景与常见误区

一个典型的工业控制场景是:Root Cell 运行 Linux,负责网络通信、人机界面和日志记录;Non-root Cell 运行一个 inmate,负责电机控制环路,要求微秒级响应。两者通过 ivshmem 交换控制指令和状态数据。由于 inmate 不经过 Linux 调度器,其响应时间不受 Root Cell 负载影响。

常见误区主要有三个:

误区 实际情况
认为 Non-root Cell 可以动态申请资源 资源在 Cell 配置文件中静态声明,运行期不可动态扩展
认为 Root Cell 崩溃不影响 Non-root Cell Root Cell 负责管理,若其崩溃,管理通道中断,但已启动的 Non-root Cell 仍可继续运行
认为 inmate 可以像普通进程一样被调试 inmate 是裸机镜像,需通过 Jailhouse 提供的调试接口或串口输出观察
在配置 Cell 时,CPU 和内存区域不能重叠。若两个 Cell 被分配到同一物理 CPU 或同一段内存,Hypervisor 会在创建阶段报错,系统不会进入不一致状态。

理解这四层结构和启动流程,是后续编写 Cell 配置文件、划分资源和调试 inmate 的基础。Jailhouse 的“静态”既是限制,也是它获得确定性的根本原因。