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 的实时性和确定性远高于通用虚拟化方案,但灵活性较低。
二、通信机制: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 主动“让位”。典型流程如下:
- 系统正常启动 Linux,加载 Jailhouse 内核模块。
- 执行
jailhouse enable,Hypervisor 被加载到 EL2,Linux 被降级为 Root Cell。 - Root Cell 解析 Cell 配置文件,确定 CPU、内存、中断和设备的划分。
- 执行
jailhouse cell create,Hypervisor 根据配置建立 Non-root Cell 的地址空间和 CPU 上下文。 - 通过
jailhouse cell load将 inmate 镜像写入目标 Cell 的内存。 - 执行
jailhouse cell start,Non-root Cell 开始运行,inmate 获得 CPU 控制权。
四、案例场景与常见误区
一个典型的工业控制场景是: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 配置文件、划分资源和调试 inmate 的基础。Jailhouse 的“静态”既是限制,也是它获得确定性的根本原因。