3. Jailhouse 架构总览
Jailhouse 是一个基于 Linux 的静态分区 hypervisor,它的设计哲学与 KVM、Xen 这类通用虚拟化方案截然不同:它不追求在同一颗 CPU 上动态调度多个通用操作系统,而是把物理硬件“切”成若干互不干扰的分区,每个分区独占一组 CPU 核、内存区域和外设,从而获得接近裸机的确定性与实时性。理解 Jailhouse 的第一步,就是看清它的整体架构:谁在管硬件、谁在跑 Linux、谁在跑裸机或实时任务,以及它们之间如何被隔离。
核心组件:hypervisor、root cell 与 inmate
Jailhouse 系统由三个层次构成。最底层是 Jailhouse hypervisor,它是一段运行在 EL2(ARM64)或 VMX root(x86)的极简代码,负责 CPU 分区、内存隔离、中断路由和设备访问控制。它本身不提供完整的设备驱动,也不做复杂的调度,只做“隔离”这一件事。
中间层是 root cell,也就是启动 Jailhouse 的那个 Linux 系统。root cell 拥有对全部硬件的初始控制权,它负责加载 hypervisor 镜像、创建 inmate 分区、管理配置,并作为“管理分区”存在。root cell 中的 Linux 仍然可以正常使用未被分配给 inmate 的 CPU、内存和外设。
最上层是 inmate,即被 Jailhouse 创建出来的非 root 分区。inmate 可以是一个裸机程序(bare-metal)、一个 RTOS(如 FreeRTOS、Zephyr),也可以是一个精简的 Linux。inmate 只能访问配置中明确分配给它的资源,无法看到 root cell 或其他 inmate 的内存与外设。
关键区分:root cell 是“管理分区”,拥有全局视野;inmate 是“被管理分区”,资源被严格限定。两者不是父子进程关系,而是由 hypervisor 在硬件层面隔离的独立执行环境。
Jailhouse 启动流程
Jailhouse 的启动不是从 BIOS 或 bootloader 直接引导 hypervisor,而是“寄生”在已经运行的 Linux 之上。典型流程如下:
- 系统正常启动 Linux,进入 root cell 环境。
- 加载
jailhouse.ko内核模块,该模块负责与 hypervisor 通信并初始化管理接口。 - 通过
jailhouse enable命令加载 hypervisor 二进制(如jailhouse.bin)和系统配置(.cell文件),将 CPU 切换到 hypervisor 模式。 - hypervisor 接管后,root cell 被“降级”为一个受 hypervisor 管理的分区,但保留管理权限。
- 使用
jailhouse cell create创建 inmate 分区,加载 inmate 镜像和对应配置。 - 使用
jailhouse cell start启动 inmate,inmate 开始在其独占的 CPU 核上运行。
# 典型启动命令序列
modprobe jailhouse
jailhouse enable /path/to/jailhouse-configs/qemu-arm64.cell
jailhouse cell create /path/to/inmate-configs/rtos-demo.cell
jailhouse cell load rtos-demo /path/to/rtos-demo.bin
jailhouse cell start rtos-demo
整个过程中,root cell 的 Linux 并不会被“暂停”,它继续运行,只是部分 CPU 核和外设被划走。这种“在线分区”能力是 Jailhouse 区别于传统 hypervisor 的重要特征。
配置单元与系统布局
Jailhouse 的资源划分完全由配置文件决定,主要分为两类:系统配置(system cell)和inmate 配置(inmate cell)。系统配置描述 root cell 保留哪些资源,以及哪些资源可以被分配给 inmate;inmate 配置则精确描述某个 inmate 能使用的 CPU、内存、中断和 PCI 设备。
| 配置类型 | 作用范围 | 关键字段 | 典型文件 |
|---|---|---|---|
| 系统配置 | 全局资源划分 | cpus、memory_regions、pci_devices、irqchips | qemu-arm64.cell |
| inmate 配置 | 单个 inmate 资源 | cpus、memory_regions、irq_map、pci_devices | rtos-demo.cell |
| 设备树片段 | inmate 硬件描述 | compatible、reg、interrupts | rtos-demo.dts |
系统布局上,Jailhouse 把物理 CPU 核划分为“root cell 核”和“inmate 核”。例如 8 核系统中,CPU0-3 留给 root cell,CPU4-7 分配给一个实时 inmate。内存则通过 memory_regions 划分,确保 inmate 的物理内存区域与 root cell 完全不重叠。中断控制器(如 GIC)也被分区管理,inmate 的中断不会路由到 root cell。
案例场景:四核 ARM 平台上的实时分区
假设一个四核 ARM64 工业控制板,运行 Linux 作为 root cell,同时需要一个 1ms 周期的实时任务。配置方案如下:CPU0-1 留给 root cell 处理网络和 UI,CPU2-3 分配给 inmate 运行 RTOS;内存方面,root cell 使用 0x40000000-0x7FFFFFFF,inmate 使用 0x80000000-0x8FFFFFFF;中断方面,定时器中断和串口中断路由给 inmate,其余中断归 root cell。启动后,inmate 的实时任务抖动可控制在微秒级,而 root cell 的 Linux 完全不受影响。
提示:Jailhouse 的配置是静态的,一旦 inmate 启动,其资源划分就不能动态更改。因此配置阶段必须仔细核对 CPU 亲和性、内存地址和中断号,避免与 root cell 冲突。
常见误区与复盘
- 误区一:把 Jailhouse 当成 KVM 使用。Jailhouse 不支持动态创建虚拟机、不支持超额分配、不支持嵌套虚拟化。它的目标是“分区隔离”,不是“通用虚拟化”。
- 误区二:认为 root cell 可以随意访问 inmate 内存。一旦 hypervisor 启用,root cell 也无法直接读写 inmate 的物理内存区域,必须通过 hypervisor 提供的通信机制(如 ivshmem)进行数据交换。
- 误区三:忽略中断隔离。如果中断没有正确路由,inmate 的中断可能被 root cell 截获,导致实时任务丢失中断。配置时必须检查
irq_map和 GIC 分区设置。 - 复盘要点:启动失败时,优先检查
dmesg中 jailhouse 模块的输出,确认 CPU 核是否被正确离线、内存区域是否重叠、PCI 设备是否被正确隐藏。
总体而言,Jailhouse 的架构可以概括为“一个 hypervisor、两个世界、三份配置”。hypervisor 提供硬件隔离底座,root cell 和 inmate 各自运行在独立分区中,而系统配置、inmate 配置和设备树片段共同定义了每个分区的资源边界。掌握这套架构,是后续理解中断隔离、设备直通和 inmate 通信的基础。