土法炼钢兴趣小组的算法知识备份

【操作系统百科】Rust for Linux

文章导航

分类入口
os
标签入口
#rust#rust-for-linux#kernel-development#memory-safety#asahi

目录

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 内核驱动:

证明了 Rust 可以写真实的内核驱动。

五、解决的问题

问题 C Rust
UAF 运行时 crash 编译时拒绝
双重释放 运行时 crash 编译时拒绝
缓冲区溢出 运行时 crash 编译时拒绝
数据竞争 需要 lockdep/kcsan 编译时拒绝(Send/Sync)
空指针 运行时 crash Option 类型

六、挑战

6.1 工具链

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。

八、社区态度

Linus Torvalds 支持引入 Rust → 但要求不强制 C 开发者学 Rust。

九、其他内核语言实验

项目 语言 状态
Rust for Linux Rust 合入主线
Redox OS Rust 独立 OS
Hubris Rust 嵌入式 OS(Oxide)
seL4 C + Isabelle/HOL 形式化验证

十、小结


参考文献

工具


上一篇Unikernel 下一篇机密计算

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-27 · os

【操作系统百科】内存回收

Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。

2026-04-28 · os

【操作系统百科】交换

swap 还值得开吗?本文讲 swap area 基础、swap cache、zram 压缩内存、zswap 前端压缩池、swappiness 的真实含义、容器里的 swap 策略,以及为什么现代 Android 全靠 zram 不靠磁盘。

2026-05-03 · os

【操作系统百科】Slab/SLUB 分配器

buddy 只管页粒度(4K+),内核大多数对象只有几十到几百字节。slab/SLUB 在 buddy 之上做对象级缓存。本文讲 slab 历史、SLUB 接手、SLOB 退场、kmem_cache、per-CPU cache、KASAN 集成。

2026-05-07 · os

【操作系统百科】用户态分配器

glibc malloc、tcmalloc、jemalloc、mimalloc 各有哲学。本文讲 arena、thread cache、size class、madvise 返还策略、碎片与 RSS 膨胀、如何根据负载选分配器。


By .