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 的直通视图。

Jailhouse CPU 资源隔离映射关系 物理 CPU(Socket 0) 物理核心 Core 0 逻辑 CPU 0 逻辑 CPU 1(SMT) 物理核心 Core 1 逻辑 CPU 2 逻辑 CPU 3(SMT) 静态分配 分区 A(实时控制) vCPU 0 → 逻辑 CPU 0 vCPU 1 → 逻辑 CPU 2 分区 B(通用 Linux) vCPU 0 → 逻辑 CPU 1 vCPU 1 → 逻辑 CPU 3 关键约束 • 同一物理核心的两个超线程(如逻辑 CPU 0 与 1)不应分给不同分区,否则共享执行单元与缓存,隔离强度下降。 • vCPU 与逻辑 CPU 为静态一对一映射,分区运行期间不会发生迁移或时间片抢占。 • 未被任何分区占用的逻辑 CPU 由 root cell 管理,可用于系统维护或动态调整。

三、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 分配做对,内存隔离和中断隔离才有稳定的执行基础。