ax-kspin 技术文档
路径:
components/kspin类型:库 crate 分层:组件层 / 自旋锁基础件 版本:0.1.1文档依据:Cargo.toml、README.md、src/lib.rs、src/base.rs
ax-kspin 是内核态自旋锁实现。它把“锁状态”和“进入临界区前要不要关抢占/关 IRQ”两件事拆开:锁本体由 BaseSpinLock 负责,临界区语义则由 kernel_guard 的 guard 类型决定。它是同步叶子基础件:不是阻塞式 mutex、不是调度器,也不是完整同步库。
1. 架构设计分析
1.1 设计定位
ax-kspin 的设计核心在于“锁”和“临界区策略”解耦:
BaseSpinLock<G, T>:负责原子测试并设置锁状态。G: BaseGuard:负责进入和退出临界区时的副作用,比如关抢占或关本地中断。
这样同一套锁实现可以派生出三种常用锁:
SpinRaw<T>:不额外做任何保护,要求调用方已经在安全上下文中。SpinNoPreempt<T>:加锁时关抢占,但不关 IRQ。SpinNoIrq<T>:加锁时同时关抢占和本地 IRQ。
这也决定了它的边界:ax-kspin 实现的是“自旋锁家族”,不是“内核同步总控”。
1.2 模块划分
src/lib.rs:公开类型别名,把kernel_guard的 guard 组合成SpinRaw/SpinNoPreempt/SpinNoIrq。src/base.rs:BaseSpinLock与BaseSpinLockGuard的具体实现,以及测试。
1.3 关键实现点
BaseSpinLock:内部保存UnsafeCell<T>,在smp下再额外保存AtomicBool锁位。BaseSpinLockGuard:保存 guard 状态与数据指针,drop 时先释放锁位,再恢复 guard 状态。try_lock():获取临界区 guard 后尝试一次 CAS,失败时会立刻恢复 guard 状态。force_unlock():仅用于极端 FFI 等场景,要求调用者自行保证安全。
1.4 smp feature 的关键影响
这是 ax-kspin 最容易被误读的一点:
- 开启
smp:锁位真实存在,通过AtomicBool做自旋。 - 关闭
smp:锁位被编译期去掉,is_locked()恒为false,排他性完全依赖 guard 语义和单核前提。
因此,ax-kspin 在单核下并不是“性能优化的普通 mutex”,而是“把锁状态优化掉的单核专用自旋锁”。
2. 核心功能说明
2.1 主要功能
- 提供可参数化临界区策略的内核自旋锁。
- 提供面向常见场景的三类类型别名。
- 在
smp下提供真实多核互斥,在非smp下保留最小语义成本。