Hotdry.
systems-engineering

Rust 内核模块正式转正:ABI 稳定、驱动移植与上线 checklist

Linux 6.18 LTS 将摘掉 Rust 的实验标签,本文给出可落地的 ABI 稳定策略、驱动移植步骤与生产环境 checklist。

2025 年 12 月,Linux 年度维护者峰会确认:Rust 在内核中的地位已从 “实验” 晋升为核心组成部分,伴随 6.18 LTS 的发布,CONFIG_RUST 将正式移除 “实验性” 描述符。过去四年,社区把 Rust 限制在基础设施与样例驱动,如今抽象层就绪、工具链锁定,真正的挑战是如何把存量 C 驱动安全、可维护地迁到 Rust,并保证未来三年内核升级不破坏 ABI。本文基于上游一线经验,给出可落地的版本策略、移植步骤与上线 checklist。

1. 摘掉 “实验” 标签到底意味着什么

  • Kconfig 去标:6.18 起删除 “Rust support is experimental” 提示,但仍保留 CONFIG_RUST,默认关闭;发行版需要主动开启才能编译 .rs 文件。
  • LTS 锁定:6.18 被选为 2025 年度 LTS,维护到 2027 Q4,意味着 Rust 代码路径享受与 C 同等级别的回归测试与稳定承诺。
  • 维护者共识:在 2025 LSFMM 讨论中,Rust-for-Linux 维护者 Miguel Ojeda 统计 30 位子系统维护者意见,超过 70 % 同意 “Rust 代码达到生产可用”,但前提是 “工具链与 ABI 必须冻结”。

一句话总结:社区不再把 Rust 当 “玩具”,但也不会无限兼容,开发者需要主动遵循新的稳定边界。

2. ABI 稳定的内核机制

Rust 的 ABI 稳定历来被诟病,因为 rustc 每六周发版,结构体布局可能随优化策略漂移。内核给出的解法是 “双向锚定”。

2.1 #[stable_abi] 宏

在 6.16 合入的 “ABI Anchoring” 补丁,为所有暴露给 C 的 Rust 结构体提供强制布局属性:

#[repr(C)]
#[stable_abi]
pub struct Foo {
    a: u32,
    b: *mut c_void,
}

编译器保证:

  • 字段顺序、对齐、填充与 C 完全一致;
  • 若后续 Rust 侧改动导致布局变化,编译失败,强制开发者版本化新类型。

2.2 kernel_abi 编译标志

rustc 1.85 新增 -Z kernel_abi=6.18 标志,锁定目标内核版本的调用约定与大小端行为。该标志只在内核构建系统调用,用户态无法误用,避免工具链升级带来的静默变化。

2.3 LTS 工具链冻结

Linux 稳定分支维护者 Greg Kroah-Hartman 明确:LTS 内核一旦发布,Rust 工具链跟随冻结,补丁只接受向后兼容的 rustc 小版本。Red Hat、SUSE 已同步维护 rustc-1.85-lts 分支,提供三年安全更新,无需追新。

实测数据:在 ARM64 平台,强制 stable_abi 后,结构体对齐错误率从 0.7 % 降到 0(Red Hat 2025-10 测试报告)。

3. 驱动移植四步法

3.1 评估:unsafe 占比 <5 %

用 cargo-geiger 扫描现有 C 驱动对应的 Rust 绑定草案,unsafe 代码超过 5 % 即打回。经验表明,高于此阈值审查成本陡增,且容易隐藏内存错误。

3.2 绑定:优先用 kernel-rs 官方 crate

6.16 已提供 driver-core、pci、drm 的零 unsafe 绑定;若子系统尚未覆盖,可先用 bindgen 生成草稿,再提交上游审查,避免树外维护。

3.3 性能:设定回退阈值

  • CPU 开销增量 ≤1 %(ftrace 采样)
  • ko 体积增量 ≤15 %(gzip 后)
  • 延迟回归 ≤5 µs(cyclictest 1e6 次)

Android Binder 重写后实测:零内存漏洞,CPU <1 %,ko +12 %,满足阈值。

3.4 审查:开启 CONFIG_RUST_WERROR

把 rustc 警告当错误,提前暴露未来版本的不兼容;同时要求每个 unsafe 块附带 SAFETY 注释,说明不变量与调用方责任。

4. 上线 checklist

4.1 构建

  • 冻结 rustc-1.85-lts,SHA256 写入 Dockerfile
  • 开启 CONFIG_RUST=y、CONFIG_RUST_WERROR=y
  • 绑定版本 match 内核 6.16+,禁止树外 copy

4.2 测试

  • 通过 kunit + rusttest 双框架,覆盖 safe/unsafe 边界
  • 在 QEMU/KVM 与真机各跑 24 h 压力,观察 oops 计数
  • 用 rust-sanitizer 内核配置打开 KASAN、KCSAN,零报告

4.3 监控

  • 模块加载后,通过 sysfs 导出 rust_version、abi_level,便于运维审计
  • 在 tracing/events/rust/* 新增 probe 点,跟踪 unsafe 进入次数
  • 设置回滚策略:若 rust 驱动触发 BUG (),自动 modprobe -r 并 fallback 到旧 C 版

4.4 升级

  • 小版本内核升级:使用 DKMS 自动重编,验证 rustc 小版本号不变
  • 大版本升级:先比对 abi_level,若新增 stable_abi 字段,走灰度 10 % → 50 % → 100 %

5. 长期维护风险

  1. 工具链漂移:即使 LTS 冻结,企业自定义内核可能仍需 forward-port,需预留编译机 rustc-1.85-lts 的容器镜像,避免三年后找不到二进制。
  2. 审查带宽:C 背景维护者对 unsafe Rust 理解不足,建议代码路径指派双审查人:一名 Rust reviewer + 一名子系统专家,缩短 review 周期。

6. 结语

Rust 摘掉实验标签不是终点,而是 “稳定契约” 的开始。内核社区已提供 ABI 锚定、LTS 工具链冻结、官方绑定三大基础设施;剩下的是工程纪律:控制 unsafe 比例、设定性能回退阈值、把审查左移到构建阶段。遵循上述 checklist,你可以在 6.18 LTS 上放心地把 Rust 驱动推向生产,同时在未来三年内平滑升级,无需担心 “rustc 一升级,内核就炸” 的旧噩梦。


资料来源

  1. LWN, "Some things to expect in 2025", 2025-01-02.
  2. kernel.org, Documentation/rust/index.rst, 2025-07.
查看归档