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
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。
【操作系统百科】交换
swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。
【操作系统百科】Slab/SLUB 分配器
buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。
【操作系统百科】用户态分配器
glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。