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 之上。典型流程如下:

  1. 系统正常启动 Linux,进入 root cell 环境。
  2. 加载 jailhouse.ko 内核模块,该模块负责与 hypervisor 通信并初始化管理接口。
  3. 通过 jailhouse enable 命令加载 hypervisor 二进制(如 jailhouse.bin)和系统配置(.cell 文件),将 CPU 切换到 hypervisor 模式。
  4. hypervisor 接管后,root cell 被“降级”为一个受 hypervisor 管理的分区,但保留管理权限。
  5. 使用 jailhouse cell create 创建 inmate 分区,加载 inmate 镜像和对应配置。
  6. 使用 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。

Jailhouse 架构与系统布局 Jailhouse Hypervisor(EL2 / VMX root) CPU 分区 · 内存隔离 · 中断路由 · 设备访问控制 Root Cell(管理分区) Linux + jailhouse.ko CPU0-3 内存 A 外设组 1 负责加载/管理 inmate Inmate(非 root 分区) 裸机 / RTOS / 精简 Linux CPU4-7 内存 B 外设组 2 资源由配置严格限定 硬件隔离边界 配置单元(.cell 文件) 系统配置:全局资源划分 cpus / memory_regions / pci Inmate 配置:分区资源 cpus / irq_map / pci_devices 设备树片段:硬件描述 compatible / reg / interrupts

案例场景:四核 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 通信的基础。