Linux 内核 70% 的漏洞是内存安全问题。Rust 的所有权系统能在编译时消除这些 bug——但把 Rust 引入 30 年历史的 C 代码库,代价是什么?
一、先看图
flowchart TD
RUST[Rust 代码<br/>驱动/模块] --> ABS[Rust 抽象层<br/>kernel crate]
ABS --> C_API[C 内核 API<br/>bindgen 生成]
C_API --> KERNEL[Linux 内核<br/>C 代码]
classDef rust fill:#f0883e22,stroke:#f0883e,color:#adbac7;
classDef c fill:#388bfd22,stroke:#388bfd,color:#adbac7;
class RUST,ABS rust
class C_API,KERNEL c
二、时间线
| 时间 | 里程碑 |
|---|---|
| 2021 | RFC 提出 |
| 2022.12 | Linux 6.1 合入基础 Rust 支持 |
| 2023-2024 | 抽象层逐步扩展 |
| 2024+ | Asahi GPU 驱动、网络驱动 |
| 2025 | kernel crate 稳定化 |
三、架构
3.1 kernel crate
use kernel::prelude::*;
module! {
type: MyModule,
name: "my_module",
license: "GPL",
}
struct MyModule;
impl kernel::Module for MyModule {
fn init(_module: &'static ThisModule) -> Result<Self> {
pr_info!("Hello from Rust!\n");
Ok(MyModule)
}
}3.2 unsafe 边界
// 安全抽象包裹 unsafe C 调用
pub fn alloc_pages(order: u32) -> Result<Page> {
// 内部调用 unsafe C API
// 但对外暴露安全接口
}原则:unsafe 集中在抽象层 → 驱动代码尽量全 safe。
四、Asahi GPU 驱动
Apple Silicon GPU 驱动 → 用 Rust 编写 → 最大的 Rust 内核驱动:
- 复杂的 GPU 状态机
- 内存管理
- 用户态接口
证明了 Rust 可以写真实的内核驱动。
五、解决的问题
| 问题 | C | Rust |
|---|---|---|
| UAF | 运行时 crash | 编译时拒绝 |
| 双重释放 | 运行时 crash | 编译时拒绝 |
| 缓冲区溢出 | 运行时 crash | 编译时拒绝 |
| 数据竞争 | 需要 lockdep/kcsan | 编译时拒绝(Send/Sync) |
| 空指针 | 运行时 crash | Option 类型 |
六、挑战
6.1 工具链
- 需要特定版本的 rustc
- 不是所有架构都支持
- 编译时间增加
6.2 维护负担
C 内核开发者需要学 Rust → 社区分裂风险。
6.3 ABI 稳定性
Rust 没有稳定的 ABI → 模块需要与内核同一 rustc 版本编译。
6.4 抽象层维护
每个 C API 变更 → Rust 抽象层需要同步更新。
七、与 eBPF 中的 Rust
// Aya 框架
#[map]
static EVENTS: PerfEventArray<Event> = PerfEventArray::new(0);
#[kprobe]
fn my_probe(ctx: ProbeContext) -> u32 {
// ...
}Aya 让你用 Rust 写 eBPF 程序 → 编译时安全检查 + BPF verifier。
八、社区态度
- 支持者:内存安全值得投入
- 反对者:增加复杂性,C 够用
- 中立者:让代码证明自己
Linus Torvalds 支持引入 Rust → 但要求不强制 C 开发者学 Rust。
九、其他内核语言实验
| 项目 | 语言 | 状态 |
|---|---|---|
| Rust for Linux | Rust | 合入主线 |
| Redox OS | Rust | 独立 OS |
| Hubris | Rust | 嵌入式 OS(Oxide) |
| seL4 | C + Isabelle/HOL | 形式化验证 |
十、小结
- Rust for Linux 解决内核 70% 的内存安全漏洞
- unsafe 集中在抽象层 → 驱动代码尽量 safe
- Asahi GPU 驱动证明了可行性
- 挑战:工具链、维护负担、ABI
- 长期趋势:新驱动用 Rust,旧代码保持 C
参考文献
rust/目录(Linux 内核)Documentation/rust/- Miguel Ojeda, “Rust for the Linux kernel.” 2022
- Asahi Linux GPU driver
工具
rustc(nightly)bindgenmake LLVM=1 rustavailable
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内核内存调试
内核内存 bug 是最难追的:UAF、OOB、double free、leak 都可能沉默数月。本文讲 KASAN 三种模式、KFENCE 生产采样、kmemleak、SLUB_DEBUG、UBSAN/KCSAN 联动。
【操作系统百科】VFS 四层抽象
Linux 的一切皆文件靠 VFS 实现——superblock、inode、dentry、file 四层抽象加 ops 表。本文讲 VFS 核心数据结构、dcache、inode cache、RCU lookup,以及文件系统如何插入 VFS。
操作系统百科
Linux 6.x 视角下的操作系统系列索引:110 篇覆盖调度、虚拟内存、文件系统与 I/O、并发、隔离、可观测性,按主题、阅读路径与关键问题三种入口组织。
【操作系统百科】用户态分配器:jemalloc vs tcmalloc
jemalloc 与 tcmalloc 都想解决多线程分配器的老问题:锁争抢、碎片、RSS 膨胀与回收抖动。但两者把优化重点放在了不同位置:tcmalloc 更激进地把热路径推到 per-CPU,jemalloc 则把 arena、extent、decay 和 profiling 做成了一套更完整的内存治理工具箱。