目录

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 的 SendSync trait 在编译期检查 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 在内核中仍有不少挑战:

  1. ABI 稳定性:Rust 还没有像 C 那样稳定的 ABI,需要额外的 FFI 层
  2. 工具链依赖:需要 LLVM 工具链,GCC 支持还在开发中
  3. 学习曲线:内核开发者需要同时学习 Rust 语言和内核抽象
  4. 双语言维护成本:C 和 Rust 的互操作需要精心设计的接口层
  5. 社区文化磨合:Linus 和内核维护者对 Rust 的态度仍在"谨慎接受"阶段

当前局限:Rust 还不能写什么?

✅ 可以写:设备驱动、文件系统、网络协议、IPC 机制
❌ 不适合写:核心调度器、内存管理器(过度依赖 C 的底层操作)
⚠️ 可以但复杂:中断处理、DMA 操作(需要 unsafe 代码)

展望:2025 之后的 Rust 内核路线图

  • 更多 PHY/网络驱动:Rust 在嵌入式网络芯片驱动中持续扩展
  • 文件系统实验:PuzzleFS 等用 Rust 编写的文件系统正在开发中
  • Rust-for-Linux 基础设施进入稳定状态kernel crate 的 API 趋于稳定
  • gccrs 成熟:GCC 原生支持 Rust 后,不再强依赖 LLVM

总结

要点 说明
为什么是 Rust 彻底消除内存安全漏洞——内核安全的第一道防线
旗舰项目 Nova GPU 驱动,用 Rust 重写 NVIDIA 驱动
当前规模 多个驱动已合入主线,Binder、PHY、GPU 均有涉足
基础设施 工具链、文档、构建系统已完善,kernel.org 提供预编译工具链
主要挑战 ABI 稳定性、双语言维护、社区文化磨合
推荐时机 2025 年是开始学习和贡献 Rust 内核开发的好时机

对于内核开发者来说,2025 年是开始学习 Rust 内核开发的最佳时机——基础设施已经就绪,社区经验在积累,而竞争才刚刚开始。对于普通开发者来说,理解 Rust 如何解决 C 语言的内核安全问题,本身就是一次很好的系统编程思维升级。