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。这种模型牺牲了资源利用率,换来了极强的确定性和隔离性——分区之间不会因为调度竞争而互相干扰。
下面是一个简化的 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 当成 KVM 或 Xen 的替代品,从而产生以下误解:
- 误以为可以动态创建任意多个 Cell:Jailhouse 的 Cell 数量与资源配置在编译和启动时基本确定,运行中动态调整能力有限。
- 误以为设备可以共享:直通意味着独占,一个设备同一时刻只能属于一个 Cell,不能像 virtio 那样被多个 Guest 共享。
- 误以为 Root Cell 仍是“特权总管”:Root Cell 可以管理 Cell 生命周期,但它不能随意访问已分配给其他 Cell 的内存和设备。
- 忽略中断控制器的配置:如果 GIC 路由未正确隔离,设备中断可能仍被 Root Cell 收到,导致 Non-root Cell 收不到中断而挂起。
复盘来看,Jailhouse 的价值不在于“虚拟化得多像”,而在于“隔离得多硬”。它用静态配置换确定性,用设备直通换低延迟,用中断隔离换实时性。理解这一点,才能正确评估它适合的场景——工业控制、车载域控制器、实时机器人等对确定性和隔离性要求极高的领域,而不是通用云计算。
上图展示了 Jailhouse 静态分区模型的核心结构:物理硬件被划分为 Root Cell 与 Non-root Cell 两个互不重叠的资源集合,CPU 核、内存区域和设备各自独占,中断控制器按 Cell 路由中断。红色虚线代表硬件隔离边界,它由 Jailhouse 在启动时配置,运行期间保持不变。这种“硬切分”正是 Jailhouse 实现设备直通与中断隔离的基础。