4. 硬件与平台要求
Jailhouse 是一个基于静态分区的裸机虚拟化方案,它并不像 KVM 那样依赖宿主操作系统,而是直接运行在硬件之上,把物理 CPU 核、内存区域和外设分配给不同的“Cell”。因此,Jailhouse 对硬件平台的要求比普通虚拟化方案更“挑剔”:CPU 必须提供虚拟化扩展,内存必须能被 IOMMU 隔离,中断必须能被可编程的中断控制器路由,调试阶段还需要可用的串口通道。本章围绕 x86、ARM、ARM64 三类平台的差异,梳理 Jailhouse 部署前的硬件与平台检查要点。
一、核心原理:Jailhouse 为什么依赖这些硬件能力
Jailhouse 的 hypervisor 代码量很小,它把大部分管理职责交给 Linux 根 Cell(Root Cell)完成。Root Cell 负责创建、启动和销毁其他 Cell,而 Jailhouse 本身只负责 CPU 分区、内存隔离和中断注入。这种“Linux 做管理、Jailhouse 做隔离”的架构,决定了它必须依赖以下硬件能力:
- CPU 虚拟化扩展:x86 需要 VMX(Intel VT-x)或 SVM(AMD-V),ARM/ARM64 需要 EL2 异常级别和 HCR_EL2 寄存器。没有这些扩展,Jailhouse 无法在非根 Cell 中陷入和模拟敏感指令。
- IOMMU:用于把设备 DMA 限制在所属 Cell 的内存区域内。x86 上对应 Intel VT-d 或 AMD-Vi,ARM/ARM64 上对应 SMMU。没有 IOMMU,设备可以绕过隔离直接访问任意内存,分区安全性无从谈起。
- 中断控制器:x86 使用本地 APIC 和 IOAPIC,ARM/ARM64 使用 GIC(GICv2/GICv3)。Jailhouse 需要把物理中断重新路由到目标 Cell,并支持中断注入。
- 串口与调试通道:Jailhouse 早期启动阶段没有操作系统支持,必须通过串口输出日志。x86 常用 8250/16550 UART,ARM/ARM64 常用 PL011 或 SBSA UART。
一句话总结:CPU 虚拟化扩展决定“能不能分区”,IOMMU 决定“分区安不安全”,中断控制器决定“分区能不能正常响应外设”,串口决定“出问题时能不能看到日志”。
二、x86、ARM、ARM64 支持差异对比
Jailhouse 对三类架构的支持程度和配置方式差异明显。x86 平台成熟度最高,文档和示例最多;ARM64 是当前社区重点维护的方向;ARM32 支持相对有限,部分新特性缺失。下表从虚拟化扩展、IOMMU、中断控制器、串口和典型平台五个维度进行对比。
| 对比维度 | x86(Intel/AMD) | ARM(32 位) | ARM64(AArch64) |
|---|---|---|---|
| CPU 虚拟化扩展 | Intel VT-x(VMX)或 AMD-V(SVM) | ARMv7 VE 虚拟化扩展,EL2 | ARMv8-A EL2,HCR_EL2/VTTBR |
| IOMMU | Intel VT-d 或 AMD-Vi | SMMU(部分 SoC 支持) | SMMUv2/SMMUv3 |
| 中断控制器 | 本地 APIC + IOAPIC + MSI | GICv2(部分 GICv3) | GICv2 / GICv3 / GICv4 |
| 串口 | 8250/16550 UART,I/O 端口 | PL011、8250,MMIO | PL011、SBSA UART,MMIO |
| 典型平台 | QEMU/KVM、工控机、服务器 | Zynq-7000、部分 i.MX | Jetson、RK3399、QEMU virt |
需要特别注意的是,ARM 和 ARM64 虽然同属 ARM 体系,但 Jailhouse 的代码路径、寄存器操作和 Cell 配置格式并不通用。ARM64 使用 AArch64 指令集和 EL2 异常模型,而 ARM32 使用 AArch32 和 ARMv7 VE,两者在中断注入、页表管理和 CPU 启动流程上都有差异。部署时必须选择与目标架构匹配的 Jailhouse 分支和配置文件。
三、方法流程:部署前的硬件检查步骤
在编译和安装 Jailhouse 之前,建议按以下流程确认平台是否满足要求。这套流程适用于 x86 和 ARM64,ARM32 可参考执行。
- 确认 CPU 虚拟化扩展已开启:x86 上检查
/proc/cpuinfo中的vmx或svm标志;ARM64 上确认内核运行在 EL2 或已启用 KVM 虚拟化支持。 - 确认 IOMMU 已启用:x86 上检查内核命令行是否包含
intel_iommu=on或amd_iommu=on,并查看/sys/class/iommu;ARM64 上检查 ACPI 或设备树中是否描述 SMMU 节点。 - 确认中断控制器型号:ARM64 上通过设备树查看
compatible属性,如arm,gic-v3;x86 上确认 APIC 和 IOAPIC 可用。 - 确认串口可用:检查
/dev/ttyS0或/dev/ttyAMA0是否存在,并确认内核已启用对应驱动。 - 获取或生成 Cell 配置:使用
jailhouse config create或参考configs/目录下对应平台的示例配置。
以下命令可用于快速检查 x86 平台的虚拟化与 IOMMU 状态:
# 检查 CPU 虚拟化扩展
grep -E "vmx|svm" /proc/cpuinfo | head -1
# 检查 IOMMU 是否启用
dmesg | grep -i -E "DMAR|IOMMU"
# 检查串口设备
ls -l /dev/ttyS0
# 查看 Jailhouse 是否已加载
lsmod | grep jailhouse
对于 ARM64 平台,设备树是获取硬件信息的主要来源:
# 查看 GIC 中断控制器
grep -A3 "interrupt-controller" /proc/device-tree/ 2>/dev/null
# 查看 SMMU 节点
find /proc/device-tree -name "*smmu*" 2>/dev/null
# 查看串口节点
find /proc/device-tree -name "*uart*" 2>/dev/null
四、案例与场景:QEMU 与真实硬件的差异
很多学习者在 QEMU 中成功运行 Jailhouse 后,直接迁移到真实硬件却遇到启动失败。常见原因包括:QEMU 默认模拟的 IOMMU 和中断控制器与真实 SoC 不一致;真实硬件的串口基地址和时钟频率与 QEMU 不同;ARM64 真实平台的 GIC 版本可能是 GICv3,而 QEMU 默认使用 GICv2。因此,在真实硬件上部署时,必须根据设备树或 ACPI 表重新生成 Cell 配置,不能直接复用 QEMU 的配置。
建议先在 QEMU 中验证 Jailhouse 的基本流程和配置语法,再迁移到真实硬件。迁移时重点核对三个参数:串口基地址、GIC 版本、SMMU 是否存在。
五、误区与复盘
在硬件与平台要求方面,初学者容易陷入以下误区:
- 误区一:认为所有 ARM64 平台都支持 Jailhouse。实际上,部分 SoC 的 EL2 被固件占用,或者 SMMU 未在设备树中描述,导致无法完成设备隔离。
- 误区二:忽略 IOMMU 的启用状态。即使 CPU 支持 VT-d,如果 BIOS 中未开启或内核未启用,Jailhouse 仍然无法隔离设备。
- 误区三:把 ARM32 配置直接用于 ARM64。两者寄存器布局和中断注入方式不同,配置不能混用。
- 误区四:调试时只看 Jailhouse 日志,不看串口输出。早期启动失败往往发生在 Linux 日志之前,只有串口能提供有效信息。
如果目标平台没有可用的 IOMMU,Jailhouse 仍然可以运行,但非根 Cell 的设备将无法被安全隔离。此时应避免把敏感外设分配给非根 Cell,或改用其他隔离方案。
复盘时建议建立一张平台检查清单,把 CPU 虚拟化扩展、IOMMU、中断控制器、串口四项作为必查项,并记录每台设备的实际型号和配置参数。这样在后续部署新 Cell 时,可以快速判断平台是否满足要求,减少反复试错的时间。