登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
代码拉取完成,页面将自动刷新
开源项目
>
其他开源
>
操作系统
&&
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
22
Star
28
Fork
31
openKylin(孵化期)
/
x-kernel
代码
Issues
54
Pull Requests
29
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
476
feat(kuaccess): add atomic user u32 cmpxchg for futex paths
已合并
openKylin(孵化期):atomic
openKylin(孵化期):main
WitcherTheWhite
创建于 2026-07-09 18:01
克隆/下载
HTTPS
SSH
复制
下载 Email Patch
下载 Diff 文件
# 概述 为 `kuaccess` 添加用户态 32-bit 原子 compare-and-exchange(cmpxchg)原语,供 futex 和 robust-list 等路径使用,消除用户态 futex 操作中的 TOCTOU(Time-of-Check-Time-of-Use)竞争条件。 # 主要变更 ## 1. 架构层:新增 `user_atomic_cmpxchg_u32` 汇编原语 在 4 种架构下分别新增 `atomic_user.S` 文件,实现带异常表(`__ex_table`)fixup 保护的用户态原子 cmpxchg: - **aarch64**(`arch/kcpu/src/aarch64/atomic_user.S`):使用 `ldxr`/`stxr` 独占访问序列 + `dmb ish` 内存屏障 - **loongarch64**(`arch/kcpu/src/loongarch64/atomic_user.S`):使用 `ll.w`/`sc.w` 链接加载序列 + `dbar 0` 屏障 - **riscv**(`arch/kcpu/src/riscv/atomic_user.S`):使用 `lr.w`/`sc.w` 链接加载序列 + `fence rw, rw` 屏障 - **x86_64**(`arch/kcpu/src/x86_64/atomic_user.S`):使用 `lock cmpxchg` 单条原子指令 每条访存指令均配有 `_asm_extable` 条目,页错误时跳转到 fixup 路径,返回非零值表示失败。 ## 2. FFI 绑定:在 `instrs.rs` 中导出汇编函数 - `arch/kcpu/src/aarch64/instrs.rs` - `arch/kcpu/src/loongarch64/instrs.rs` - `arch/kcpu/src/riscv/instrs.rs` - `arch/kcpu/src/x86_64/instrs.rs` 通过 `core::arch::global_asm!(include_str!("atomic_user.S"))` 嵌入汇编,并在 `unsafe extern "C"` 块中声明 `pub fn user_atomic_cmpxchg_u32(...)`。 ## 3. 核心 API:`kuaccess` 新增原子操作层 `core/kuaccess/src/lib.rs` 新增 3 个公开函数: - **`atomic_cmpxchg_u32(addr, old, new) -> MemResult<(bool, u32)>`**:核心原语,先校验 4 字节对齐和用户地址范围,在 `IrqSave` 保护下调用架构原语,返回是否交换成功及观测值 - **`atomic_load_u32(addr) -> MemResult<u32>`**:原子加载,内部实现为 `cmpxchg(addr, 0, 0)`,不修改内存 - **`atomic_u32_eq(addr, expected) -> MemResult<bool>`**:原子比较,内部实现为 `cmpxchg(addr, expected, expected)`,不修改内存 同时新增完整的单元测试覆盖:对齐拒绝、越界拒绝、成功更新、不匹配保留、原子加载、原子比较、未映射地址 fault。 ## 4. Futex 路径迁移:消除 TOCTOU 竞争 `core/ksyscall/src/sync/futex.rs` 中将原有的 `uaddr.read_vm()?` 替换为 `atomic_u32_eq()`: - `FUTEX_WAIT` / `FUTEX_WAIT_BITSET` 路径中的初始值检查 - `FUTEX_WAIT_BITSET` 路径中 `wait_if` 回调内的值检查(持有锁后重检查) - `FUTEX_CMP_REQUEUE` 路径中的值检查 确保 futex word 的比较与后续操作之间不会被用户态并发修改。 ## 5. Robust-List Futex 死亡通知增强 `posix/process/src/runtime.rs` 新增 `mark_futex_owner_died()` 函数,使用 `atomic_cmpxchg_u32` 循环原子地设置 futex word 的 `FUTEX_OWNER_DIED` 位(同时保留 `FUTEX_WAITERS` 位),替代原有的 `read_vm()` 路径。 ## 6. 文档与配置更新 - `core/kuaccess/Cargo.toml`:添加 `unittest_support` workspace 依赖 - `posix/process/Cargo.toml`:添加 `kuaccess` workspace 依赖 - `core/kuaccess/docs/design.md`:新增用户态原子 cmpxchg 的算法流程、架构图和并发模型说明 - `core/kuaccess/docs/security.md`:新增原子操作的内存安全不变量和已知限制 - `arch/kcpu/docs/security.md`:更新 checklist 涵盖 `atomic_user.S` # Diagram Walkthrough 以下流程图展示了本次变更的核心数据流与模块间关系: ```mermaid flowchart TD A["用户态线程\n(futex/robust-list 操作)"] subgraph B["futex syscall 层\ncore/ksyscall/src/sync/futex.rs"] B1["FUTEX_WAIT"] B2["FUTEX_CMP_REQUEUE"] B3["wait_if 回调\n(持有锁后重检查)"] end subgraph C["线程退出处理\nposix/process/src/runtime.rs"] C1["exit_robust_list"] C2["mark_futex_owner_died\n(循环 cmpxchg 设 DIED 位)"] end subgraph D["kuaccess 原子 API\ncore/kuaccess/src/lib.rs"] D1["atomic_cmpxchg_u32"] D2["atomic_load_u32"] D3["atomic_u32_eq"] end subgraph E["架构层汇编\narch/kcpu/src/*/atomic_user.S"] E1["user_atomic_cmpxchg_u32\n(ldxr/stxr / ll/sc / lr/sc / lock cmpxchg)"] end subgraph F["异常处理"] F1["dispatch_irq_page_fault"] F2["__ex_table fixup"] end A -- "sys_futex" --> B B1 --> D3 B2 --> D3 B3 --> D3 A -- "线程退出" --> C C1 --> C2 C2 --> D1 D1 --> D2 D1 --> D3 D1 -- "调用" --> E1 D2 -- "cmpxchg(0,0) 实现" --> D1 D3 -- "cmpxchg(expected,expected) 实现" --> D1 E1 -- "页错误" --> F1 F1 -- "无法解析" --> F2 F2 -- "返回非零" --> D1 D1 -- "映射为 MemError::NoAccess" --> B D1 -- "映射为 MemError::NoAccess" --> C ``` # 新增功能 - 用户态 32-bit 原子 cmpxchg 原语,跨 4 种架构(aarch64 / loongarch64 / riscv / x86_64) - `kuaccess` 提供 `atomic_cmpxchg_u32`、`atomic_load_u32`、`atomic_u32_eq` 三个安全封装函数 - Robust-List 线程退出时原子标记 futex owner died # Bug 修复 - **消除 Futex 路径中的 TOCTOU 竞争**:原有实现使用 `uaddr.read_vm()` 读取用户态 futex word 后再做判断,用户态可在读取后、操作前修改该值导致竞态。替换为 `atomic_u32_eq` 后,读取与判断在架构原子指令内完成,用户态无法在中间篡改。
此 Pull Request 需要通过一些审核项
类型
指派人员
状态
审查
Debin
郭伟康
已审查通过
于博
已完成
(1/1人)
测试
王1宁
已测试通过
x-cibot
已测试通过
已完成
(2/1人)
怎样手动合并此 Pull Request
git checkout main
git pull https://gitee.com/openkylin/x-kernel.git atomic
git push origin main
评论
23
提交
5
文件
20
检查
代码问题
0
批量操作
展开设置
折叠设置
审查
Code Owner
审查人员
王炼
lianux
du yq221
du-yq221
xiaohui
buhenxihuan
sunyi
buaasaseesunyi
liuguang
liuguangpz
junheart
junheart
13756958263
mikewanggx
Wei Liu
liuwei4
Debin
luodeb
郭伟康
guo-weikang
于博
kylinyubo
sunhaosheng
sunhaosheng-kylin
王1宁
yeanwang
WitcherTheWhite
withcherthewhite
huangshijia
sj_huang
罗志贤
wxyy1
zgyxyd666
zgyxyd
x-cibot
x-cibot
yishuqi
yishuqi-147
liujizhou
zhoujier
未设置
最少人数
1
测试
王炼
lianux
du yq221
du-yq221
xiaohui
buhenxihuan
sunyi
buaasaseesunyi
liuguang
liuguangpz
junheart
junheart
13756958263
mikewanggx
Wei Liu
liuwei4
Debin
luodeb
郭伟康
guo-weikang
于博
kylinyubo
sunhaosheng
sunhaosheng-kylin
王1宁
yeanwang
WitcherTheWhite
withcherthewhite
huangshijia
sj_huang
罗志贤
wxyy1
zgyxyd666
zgyxyd
x-cibot
x-cibot
yishuqi
yishuqi-147
liujizhou
zhoujier
未设置
最少人数
1
优先级
不指定
严重
主要
次要
不重要
标签
openkylin-cla/yes
关联 Issue
IK0KMM
用户态原子 cmpxchg 原语实现
Pull Request 合并后将关闭上述关联 Issue
里程碑
未关联里程碑
X-KERNEL20260630
X-KERNEL20260930
X-KERNEL 2026.1230
参与者
(4)
Rust
1
https://gitee.com/openkylin/x-kernel.git
git@gitee.com:openkylin/x-kernel.git
openkylin
x-kernel
x-kernel
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册