2. 虚拟化与分区基础

要理解 Jailhouse 为什么能做到“设备直通”和“中断隔离”,必须先回到虚拟化最基础的问题:一台物理机上的资源,究竟由谁分配、由谁仲裁、由谁隔离。传统虚拟化追求“让多个操作系统看起来各自拥有一台完整机器”,而 Jailhouse 走的是另一条路——它不模拟硬件,而是把物理硬件“切”成若干互不重叠的分区,让每个分区直接拥有真实的 CPU、内存和设备。本节从虚拟化基本概念出发,对比 Hypervisor 类型,重点讲清 Jailhouse 的静态分区模型,并说明它与非虚拟化系统的本质差异。

一、虚拟化的三个基本抽象

虚拟化的核心是把物理资源抽象成可分配、可隔离、可调度的逻辑资源。无论哪种 Hypervisor,都绕不开三个抽象层次:

  • CPU 虚拟化:把物理 CPU 的时间片或核心分配给不同执行环境。全虚拟化靠陷入-模拟(trap-and-emulate)或硬件辅助(Intel VT-x、AMD-V)实现;半虚拟化则要求 Guest 主动配合。
  • 内存虚拟化:Guest 看到的“物理地址”是虚拟的,需要经过一层地址翻译(如 EPT、Stage-2 页表)映射到真实物理地址,从而保证分区之间内存互不可见。
  • I/O 虚拟化:设备要么被模拟(virtio、emulated NIC),要么被共享(SR-IOV),要么被整块直通给某个分区独占。Jailhouse 的选择是最后一种——设备不模拟、不共享,直接归属某个分区。

这三个抽象决定了隔离的强度。抽象层越多,灵活性越高,但开销和不确定性也越大;抽象层越少,越接近裸机,实时性和确定性越好,但灵活性下降。Jailhouse 的设计哲学正是“尽可能少抽象”。

二、Hypervisor 的两种类型

按运行位置,Hypervisor 通常分为 Type 1(裸机型)和 Type 2(宿主型)。Type 1 直接运行在硬件上,如 Xen、VMware ESXi、KVM(严格说 KVM 是内核模块,常被归为准 Type 1);Type 2 运行在宿主操作系统之上,如 VirtualBox、VMware Workstation。Jailhouse 属于 Type 1,但它比传统 Type 1 更“轻”:它不提供完整的虚拟机管理功能,不调度 Guest,只负责建立分区并配置硬件隔离。

对比维度 传统 Type 1(如 Xen) Jailhouse
资源分配方式 动态调度、按需分配 静态配置、启动时固定
CPU 使用 时间片共享,vCPU 调度 物理核独占,不共享
设备访问 模拟或半虚拟化为主 整设备直通,无模拟
中断处理 Hypervisor 拦截并注入 中断控制器隔离,直接投递
典型场景 通用云计算、多租户 实时控制、工业、车载

三、Jailhouse 静态分区模型

Jailhouse 把系统划分为若干 Cell(分区)。其中有一个特殊的 Root Cell,它在 Jailhouse 启用前就是运行中的 Linux 系统,负责管理其余 Cell 的创建与销毁;其余称为 Non-root Cell,通常运行裸机程序或实时操作系统。每个 Cell 拥有一组固定的物理 CPU 核、一段固定的物理内存区域,以及若干直通设备。

“静态”体现在两个层面:一是资源配置在启动时由配置文件(.cell 文件)确定,运行期间不动态迁移;二是 CPU 核不共享,一个核在同一时刻只属于一个 Cell。这种模型牺牲了资源利用率,换来了极强的确定性和隔离性——分区之间不会因为调度竞争而互相干扰。

关键点:Jailhouse 的分区不是“虚拟机”,而是“物理资源的硬切分”。每个 Cell 看到的 CPU、内存、设备都是真实的,不需要地址翻译层,也不需要设备模拟。

下面是一个简化的 Cell 配置片段,展示 CPU 与内存的静态划分:

/* root cell 保留 CPU 0-1,non-root cell 使用 CPU 2-3 */
.cpu_set = {
    .cpu_ids = { 2, 3 },
};

.memory_regions = {
    { .phys_start = 0x80000000,
      .size       = 0x20000000,
      .flags      = JAILHOUSE_MEM_READ  |
                    JAILHOUSE_MEM_WRITE |
                    JAILHOUSE_MEM_EXECUTE },
};

/* 直通设备:仅该 Cell 可见 */
.pci_devices = {
    { .type = JAILHOUSE_PCI_TYPE_DEVICE,
      .domain = 0x0000, .bus = 0x01,
      .dev = 0x00, .func = 0x0 },
};

配置完成后,Jailhouse 会关闭这些 CPU 核上的 Linux 调度,把核交给目标 Cell,并配置中断控制器(如 GIC)使对应中断只路由到该 Cell。这样,设备产生的中断不会“误入”其他分区,实现了中断隔离。

四、与非虚拟化系统的差异

非虚拟化系统(裸机)中,操作系统直接管理全部 CPU、内存和外设,中断由单一内核统一处理。引入 Jailhouse 后,系统在启动阶段仍像裸机一样运行 Linux,直到 Jailhouse 被激活,才把部分资源“让渡”给其他 Cell。差异主要体现在:

  • 资源所有权:裸机中所有资源归一个 OS;Jailhouse 中资源按 Cell 划分,Root Cell 不再拥有被划走的核与设备。
  • 中断路径:裸机中断直达唯一内核;Jailhouse 中中断控制器被配置为按 Cell 分发,跨 Cell 中断被硬件阻断。
  • 故障域:裸机一个驱动崩溃可能拖垮全系统;Jailhouse 中 Non-root Cell 崩溃通常不影响 Root Cell 和其他 Cell。
  • 启动时序:裸机直接启动 OS;Jailhouse 需要先启动 Linux,再加载 Hypervisor 并创建 Cell,存在“先有 Root Cell,后有其他 Cell”的顺序。
理解这一点很关键:Jailhouse 不是让 Linux 变成 Guest,而是让 Linux 继续作为 Root Cell 运行,同时把一部分硬件“交出去”。因此它更像一种“资源切分器”,而不是传统意义上的虚拟机监视器。

五、常见误区与复盘

初学者容易把 Jailhouse 当成 KVM 或 Xen 的替代品,从而产生以下误解:

  1. 误以为可以动态创建任意多个 Cell:Jailhouse 的 Cell 数量与资源配置在编译和启动时基本确定,运行中动态调整能力有限。
  2. 误以为设备可以共享:直通意味着独占,一个设备同一时刻只能属于一个 Cell,不能像 virtio 那样被多个 Guest 共享。
  3. 误以为 Root Cell 仍是“特权总管”:Root Cell 可以管理 Cell 生命周期,但它不能随意访问已分配给其他 Cell 的内存和设备。
  4. 忽略中断控制器的配置:如果 GIC 路由未正确隔离,设备中断可能仍被 Root Cell 收到,导致 Non-root Cell 收不到中断而挂起。

复盘来看,Jailhouse 的价值不在于“虚拟化得多像”,而在于“隔离得多硬”。它用静态配置换确定性,用设备直通换低延迟,用中断隔离换实时性。理解这一点,才能正确评估它适合的场景——工业控制、车载域控制器、实时机器人等对确定性和隔离性要求极高的领域,而不是通用云计算。

Jailhouse 静态分区模型:硬件资源硬切分 物理硬件层 CPU 0-3 | 物理内存 | GIC 中断控制器 | PCIe 设备 Root Cell(Linux) 管理 Cell 生命周期 CPU 0-1 独占物理核 内存 A 0x8000_0000 直通设备:网卡 / 存储控制器 设备中断仅路由到 Root Cell Jailhouse 启用后:不再调度 CPU 2-3 Non-root Cell(RTOS / 裸机) 实时任务,确定性执行 CPU 2-3 独占物理核 内存 B 0xA000_0000 直通设备:运动控制卡 / 采集卡 设备中断仅路由到该 Cell 崩溃不影响 Root Cell 与其他 Cell 硬件隔离边界 GIC 按 Cell 路由中断

上图展示了 Jailhouse 静态分区模型的核心结构:物理硬件被划分为 Root Cell 与 Non-root Cell 两个互不重叠的资源集合,CPU 核、内存区域和设备各自独占,中断控制器按 Cell 路由中断。红色虚线代表硬件隔离边界,它由 Jailhouse 在启动时配置,运行期间保持不变。这种“硬切分”正是 Jailhouse 实现设备直通与中断隔离的基础。