4. CPU 资源隔离核心概念
在 Jailhouse 的分区化虚拟化模型中,CPU 资源隔离是整套隔离机制的起点。Jailhouse 并不像 KVM 那样让多个客户机共享同一个调度器时间片,而是把物理 CPU 核直接“分配”给某个分区,使该分区在运行时独占这些核。要理解这种隔离方式,必须先厘清物理 CPU、逻辑 CPU、vCPU 映射、CPU 亲和性以及独占与共享策略这几个层层递进的概念。
一、从物理 CPU 到逻辑 CPU:硬件视角的层级
物理 CPU 指主板上实际存在的处理器封装(socket)。一个物理 CPU 内部通常包含多个物理核心(core),每个核心又可能通过超线程(SMT/Hyper-Threading)暴露为多个逻辑 CPU。操作系统看到的“CPU 编号”其实是逻辑 CPU,例如 /proc/cpuinfo 中列出的 processor 0、1、2、3。Jailhouse 在初始化时会枚举这些逻辑 CPU,并把它们作为可分配的最小单位。
需要特别注意的是:如果两个逻辑 CPU 属于同一个物理核心(即同一核心的两个超线程),它们共享执行单元、L1/L2 缓存等资源。因此,把同一核心的两个超线程分给两个不同分区,会破坏隔离的强度。Jailhouse 的配置通常要求以物理核心为粒度进行分配,避免跨分区共享核心内部资源。
二、vCPU 映射:分区视角的虚拟处理器
在 Jailhouse 中,每个分区(cell)拥有一个或多个 vCPU。vCPU 并不是一个被调度的软件线程,而是对某个物理逻辑 CPU 的“绑定式映射”。当分区被创建时,配置文件中通过 cpu_set 指定该分区可以使用哪些逻辑 CPU;Jailhouse hypervisor 随后把这些物理 CPU 交给该分区的 vCPU 使用。分区内的操作系统看到的是这些被分配的 CPU,而无法访问其他分区的 CPU。
这种映射是静态的、一对一的:一个 vCPU 对应一个物理逻辑 CPU,不会出现多个 vCPU 争抢同一个物理 CPU 的情况。这正是 Jailhouse 与 KVM 的本质区别——KVM 的 vCPU 是调度实体,而 Jailhouse 的 vCPU 是物理 CPU 的直通视图。
三、CPU 亲和性:把 vCPU 钉在指定核上
CPU 亲和性(CPU affinity)描述的是任务或 vCPU 与特定逻辑 CPU 之间的绑定关系。在 Jailhouse 中,亲和性不是通过 Linux 的 taskset 或调度器动态调整的,而是在分区配置文件中静态声明。配置片段通常如下:
struct jailhouse_cell_desc {
.name = "rt-cell",
.cpu_set = { 0x05 }, /* 二进制 0101,表示使用逻辑 CPU 0 和 2 */
...
};
这里的 cpu_set 是一个位掩码,每一位对应一个逻辑 CPU。位为 1 表示该 CPU 被分配给此分区。由于映射是静态的,分区启动后其 vCPU 不会漂移到其他 CPU 上,从而保证了确定性的执行延迟。对于实时性要求高的场景,这种“钉死”的亲和性比动态调度更可预测。
四、独占与共享策略:隔离强度的取舍
Jailhouse 的 CPU 分配策略可以分为独占和共享两类。独占策略下,一个逻辑 CPU 只属于一个分区,其他分区无法使用;共享策略则允许某些 CPU 在多个分区之间按时间或事件切换。Jailhouse 默认倾向于独占,因为独占才能提供强隔离。但在某些资源受限的嵌入式平台上,root cell 可能需要保留部分 CPU 用于管理,此时会出现“root cell 与某个分区共享某些 CPU”的配置,这需要谨慎评估实时性影响。
| 策略 | 分配方式 | 隔离强度 | 适用场景 |
|---|---|---|---|
| 独占 | 一个逻辑 CPU 仅属于一个分区 | 强,无跨分区干扰 | 实时控制、安全关键任务 |
| 共享 | 多个分区分时使用同一逻辑 CPU | 弱,存在调度抖动 | 非实时管理分区、资源受限平台 |
| 混合 | 部分 CPU 独占,部分共享 | 中等,需仔细规划 | root cell 与实时分区共存 |
五、案例:四核嵌入式平台的分区规划
假设一块四核 ARM 板,逻辑 CPU 0~3,无超线程。规划两个分区:实时控制分区 rt-cell 需要两个核,通用 Linux 分区 linux-cell 需要两个核。配置如下:
/* rt-cell 配置 */
.cpu_set = { 0x03 }; /* 逻辑 CPU 0、1 */
/* linux-cell 配置 */
.cpu_set = { 0x0C }; /* 逻辑 CPU 2、3 */
这样每个分区独占两个物理核心,互不干扰。rt-cell 的 vCPU 0 映射到逻辑 CPU 0,vCPU 1 映射到逻辑 CPU 1;linux-cell 同理。启动后,两个分区各自运行,Jailhouse hypervisor 只在中断路由和少量管理路径上介入,不参与 CPU 调度。
常见误区:把同一物理核心的两个超线程分给两个不同分区,误以为“每个分区都有一个核”。实际上它们共享执行单元和缓存,一个分区的计算密集任务会拖慢另一个分区,隔离名存实亡。规划时应以物理核心为最小分配单位。
复盘要点:先确认硬件拓扑(哪些逻辑 CPU 属于同一物理核心),再按物理核心粒度划分 cpu_set;实时分区优先独占,管理分区可共享;配置完成后用 jailhouse cell list 和 /proc/jailhouse/cells 核对每个分区的 CPU 分配是否符合预期。
理解物理 CPU、逻辑 CPU、vCPU 映射、亲和性与独占/共享策略之间的关系,是后续配置 Jailhouse 分区、排查 CPU 隔离问题的前提。只有把 CPU 分配做对,内存隔离和中断隔离才有稳定的执行基础。