ax-cpumask 技术文档
路径:
components/cpumask类型:库 crate 分层:组件层 / CPU 位图基础件 版本:0.3.0文档依据:Cargo.toml、README.md、src/lib.rs
ax-cpumask 是一个面向 CPU 集合表达的 const-generic 位图类型。它对齐 Linux cpumask_t 的基本思想:一位对应一个 CPU 编号,并提供位运算、搜索和迭代接口。它属于叶子基础件:只是“CPU 集合值类型”,不是 CPU 拓扑模型、负载均衡器,也不是调度策略本体。
1. 架构设计分析
1.1 设计定位
ax-cpumask 的价值在于把“CPU 集合”收敛成一个小而稳定的类型:
ax-task用它表示任务 CPU affinity。axvm/axvisor用它表示 vCPU 目标集合。- 平台或上层策略代码可以在不引入复杂调度逻辑的情况下操作 CPU 集合。
这意味着 ax-cpumask 只负责位集语义,不负责回答“该把任务迁到哪个 CPU”“哪些 CPU 在线”这类策略问题。
1.2 核心类型
CpuMask<const SIZE: usize>:主体类型,内部包装bitmaps::Bitmap<SIZE>。Iter<'a, SIZE>:遍历置位 CPU 编号的双端迭代器。
1.3 表示方式与容量边界
CpuMask 的底层存储会根据 SIZE 自动选最小合适的无符号类型:
SIZE == 1时可退化成bool语义。SIZE <= 128时用单个整数存储。SIZE > 128时按[u128; N]形式存储,当前最大支持1024位。
源码还额外为 256 到 1024 位的若干常见尺寸提供了 [u128; N] 之间的显式 From 转换,方便虚拟化或多核位图序列化。
1.4 能力主线
它提供的能力主要分为四类:
- 构造:
new()、full()、mask(bits)、one_shot(index)、from_value()、from_raw_bits()。 - 查询:
len()、is_empty()、is_full()、get()、first_index()、last_index()、first_false_index()等。 - 变换:
set()、invert(),以及BitAnd/BitOr/BitXor/Not。 - 遍历:
IntoIterator for &CpuMask,支持双端迭代。
2. 核心功能说明
2.1 主要功能
- 用紧凑位图表达 CPU 集合。
- 提供 CPU 集合的位运算、搜索和迭代能力。
- 为上层 affinity、目标 CPU 选择等场景提供一个可复制、可比较、可哈希的值对象。
2.2 关键 API 与真实使用位置
CpuMask::new()/set():ax-task/src/api.rs用来构造AxCpuMask。get()/is_empty():ax-task/src/run_queue.rs用于根据 affinity 选择运行队列。CpuMask:components/axvm/src/vm.rs和os/axvisor/src/vmm/vcpus.rs直接使用,用来描述 vCPU 目标集合。
2.3 使用边界
ax-cpumask不负责验证 CPU 是否在线;它只存位。ax-cpumask不负责 hotplug 或 NUMA 信息。ax-cpumask也不做迁移决策;上层只把它当约束条件或目标集合。
3. 依赖关系图谱
3.1 关键直接依赖
bitmaps:底层位图实现来源。
3.2 关键直接消费者
ax-task:任务 affinity 的核心值类型。axvm/axvisor:虚拟机或 vCPU 目标集合表达。