2026-04-27 · os
【操作系统百科】内存回收
Linux 内存回收是 VM 最复杂的子系统之一。本文讲 active/inactive LRU、kswapd 与 direct reclaim、watermark 三线、swappiness 的真实含义、MGLRU 改造、memcg 回收与 PSI。


























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 稳定化 |
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)
}
}// 安全抽象包裹 unsafe C 调用
pub fn alloc_pages(order: u32) -> Result<Page> {
// 内部调用 unsafe C API
// 但对外暴露安全接口
}原则:unsafe 集中在抽象层 → 驱动代码尽量全 safe。
Apple Silicon GPU 驱动 → 用 Rust 编写 → 最大的 Rust 内核驱动:
证明了 Rust 可以写真实的内核驱动。
| 问题 | C | Rust |
|---|---|---|
| UAF | 运行时 crash | 编译时拒绝 |
| 双重释放 | 运行时 crash | 编译时拒绝 |
| 缓冲区溢出 | 运行时 crash | 编译时拒绝 |
| 数据竞争 | 需要 lockdep/kcsan | 编译时拒绝(Send/Sync) |
| 空指针 | 运行时 crash | Option 类型 |
C 内核开发者需要学 Rust → 社区分裂风险。
Rust 没有稳定的 ABI → 模块需要与内核同一 rustc 版本编译。
每个 C API 变更 → 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 | 形式化验证 |
rust/ 目录(Linux 内核)Documentation/rust/rustc(nightly)bindgenmake LLVM=1 rustavailable把当前热点继续串成多页阅读,而不是停在单篇消费。
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
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 膨胀、如何根据负载选分配器。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。