Rust in Linux Kernel 2025:从驱动到核心的嵌入式之旅
前言
2022 年底,Linux 6.1 合并了初始的 Rust 基础设施——彼时更像一个"技术实验"。三年后的 2025 年,Rust 在 Linux 内核中已经不再是"能不能用"的问题,而是"用在哪些地方最合适"。从 GPU 驱动到 Binder IPC,从网络 PHY 到 DRM 框架,Rust 正以渐进的方式渗透到内核的各个子系统。
为什么内核需要 Rust?
Linux 内核约 70% 的安全漏洞来自内存安全问题(use-after-free、缓冲区溢出、空指针解引用)。C 语言给了开发者最大的自由度,也带来了最大的风险。
Rust 的所有权系统和借用检查器在编译期就能消除这些隐患:
// C 语言:容易写出 UAF(Use-After-Free)
struct device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
// ... 使用 dev ...
kfree(dev);
// ... 意外继续使用 dev ...
dev->name = "oops"; // ❌ Use-After-Free!编译器不会报错
// Rust:所有权系统在编译期阻止了这种错误
let dev = Box::new(Device::new());
// ... 使用 dev ...
drop(dev); // 或离开作用域自动释放
// dev.name = "oops"; // ❌ 编译错误:dev 已被移动/释放
Rust 不会消除所有 bug,但彻底消除了整个内存安全漏洞类别。对于操作系统内核来说,这是质的飞跃。
2025 年的 Rust 内核生态
内核主线中的 Rust 驱动
截至 2025 年中,以下 Rust 驱动已经合入 Linux 主线:
| 驱动 | 说明 | 状态 |
|---|---|---|
| Nova GPU 驱动 | NVIDIA GSP 固件接口的 GPU 驱动,支持 RTX 20+ 系列 | ✅ mainline |
| ASIX PHY 驱动 | 以太网 PHY 芯片驱动 | ✅ mainline |
| AMCC QT2025 PHY | 另一款以太网 PHY 驱动 | ✅ mainline |
| Null Block 驱动 | 测试用块设备驱动 | ✅ mainline |
| Binder 驱动 | Android IPC 机制的 Rust 实现 | ✅ mainline |
| Tyr GPU 驱动 | 实验性 GPU 驱动 | ✅ mainline |
Nova GPU 驱动:Rust 内核的旗舰项目
Nova 是 2025 年 Rust 在内核中最引人注目的项目——一个从头用 Rust 编写的 NVIDIA GPU 驱动,用于取代旧的 nvidia.ko 专有驱动。
Nova 驱动架构:
┌─────────────────────────────────┐
│ DRM 框架 (C) │ 标准显示子系统接口
├─────────────────────────────────┤
│ Nova-DRM (Rust) │ DRM 用户空间 API 实现
├─────────────────────────────────┤
│ Nova-Core (Rust) │ PCIe 通信 + GSP IPC
├─────────────────────────────────┤
│ NVIDIA GSP 固件 (闭源) │ 硬件控制层
└─────────────────────────────────┘为什么选择 Rust 写 GPU 驱动?
GPU 驱动是内核中最复杂、最并发、最需要安全的子系统之一——恰好是 Rust 的所有权和并发安全模型最能发挥价值的地方。Nova 利用 Rust 的
Send和Synctrait 在编译期检查 GPU 命令缓冲区的并发访问正确性。
// Nova 驱动中的 GPU 命令缓冲区抽象(简化示意)
struct CommandBuffer {
data: Vec<u8>,
write_pos: usize,
}
impl CommandBuffer {
/// 写入 GPU 命令——Rust 所有权模型确保同一时间只有一个写入者
pub fn push_command(&mut self, cmd: &GpuCommand) -> Result<()> {
// 编译期保证:不可能同时有两个线程调用 push_command
self.data.extend_from_slice(&cmd.encode());
Ok(())
}
/// 提交到 GPU——同时获取不可变引用,确保提交时不会写入
pub fn submit(&self, gpu: &GpuDevice) -> Result<()> {
gpu.dma_fence(self.data.as_slice())
}
}Rust 内核开发的体验
内核模块示例
用 Rust 写一个简单的内核模块:
// SPDX-License-Identifier: GPL-2.0
//! 一个简单的 Rust 内核模块示例
use kernel::prelude::*;
module! {
type: MyModule,
name: "my_rust_module",
author: "Developer",
description: "A Rust kernel module example",
license: "GPL",
}
struct MyModule;
impl kernel::Module for MyModule {
fn init(_module: &'static ThisModule) -> Result<Self> {
pr_info!("Hello from Rust kernel module!\n");
// 安全的设备文件创建
let _dev = kernel::device::Device::new()?;
Ok(MyModule)
}
}
impl Drop for MyModule {
fn drop(&mut self) {
pr_info!("Goodbye from Rust kernel module!\n");
}
}构建 Rust 内核模块
# 1. 准备内核源码和 Rust 工具链
make defconfig
scripts/config -e CONFIG_RUST
make rustavailable
# 2. 编译包含 Rust 支持的内核
make -j$(nproc)
# 3. 编译外部 Rust 模块
make LLVM=1 -C /lib/modules/$(uname -r)/build M=$(pwd)自 2024 年起,kernel.org 开始提供预编译的 LLVM + Rust 工具链,大大降低了 Rust 内核开发的入门门槛。
内核 Rust 基础设施的成熟度
2025 年的 Rust 内核基础设施已经相当完善:
| 组件 | 说明 | 状态 |
|---|---|---|
| Rust for Linux | 核心抽象层(kernel crate) |
✅ 稳定 |
| bindgen | 自动生成 C 绑定 | ✅ 成熟 |
| rustc_codegen_gcc | GCC 后端的 Rust 编译器 | 🚧 开发中 |
| gccrs | GCC 原生的 Rust 前端 | 🚧 开发中 |
| 文档 | Documentation/rust/ 下的完整文档 |
✅ 完善 |
| 测试框架 | KUnit + Rust 集成测试 | ✅ 可用 |
挑战与局限
尽管进展喜人,Rust 在内核中仍有不少挑战:
- ABI 稳定性:Rust 还没有像 C 那样稳定的 ABI,需要额外的 FFI 层
- 工具链依赖:需要 LLVM 工具链,GCC 支持还在开发中
- 学习曲线:内核开发者需要同时学习 Rust 语言和内核抽象
- 双语言维护成本:C 和 Rust 的互操作需要精心设计的接口层
- 社区文化磨合:Linus 和内核维护者对 Rust 的态度仍在"谨慎接受"阶段
当前局限:Rust 还不能写什么?
✅ 可以写:设备驱动、文件系统、网络协议、IPC 机制
❌ 不适合写:核心调度器、内存管理器(过度依赖 C 的底层操作)
⚠️ 可以但复杂:中断处理、DMA 操作(需要 unsafe 代码)展望:2025 之后的 Rust 内核路线图
- 更多 PHY/网络驱动:Rust 在嵌入式网络芯片驱动中持续扩展
- 文件系统实验:PuzzleFS 等用 Rust 编写的文件系统正在开发中
- Rust-for-Linux 基础设施进入稳定状态:
kernelcrate 的 API 趋于稳定 - gccrs 成熟:GCC 原生支持 Rust 后,不再强依赖 LLVM
总结
| 要点 | 说明 |
|---|---|
| 为什么是 Rust | 彻底消除内存安全漏洞——内核安全的第一道防线 |
| 旗舰项目 | Nova GPU 驱动,用 Rust 重写 NVIDIA 驱动 |
| 当前规模 | 多个驱动已合入主线,Binder、PHY、GPU 均有涉足 |
| 基础设施 | 工具链、文档、构建系统已完善,kernel.org 提供预编译工具链 |
| 主要挑战 | ABI 稳定性、双语言维护、社区文化磨合 |
| 推荐时机 | 2025 年是开始学习和贡献 Rust 内核开发的好时机 |
对于内核开发者来说,2025 年是开始学习 Rust 内核开发的最佳时机——基础设施已经就绪,社区经验在积累,而竞争才刚刚开始。对于普通开发者来说,理解 Rust 如何解决 C 语言的内核安全问题,本身就是一次很好的系统编程思维升级。