Rust-for-Linux(在 Linux 核心中使用 Rust)
Linux 核心幾乎完全以 C 撰寫,而其中最危險、最難找的臭蟲是記憶體安全臭蟲——釋放後使用、緩衝區溢位、資料競爭——正是 C 完全無從防範、而記憶體安全語言能予以排除的那一類。Rust-for-Linux 是一項持續進行的努力,目的是讓核心的部分以 Rust 撰寫;Rust 這個語言的編譯器在編譯期強制記憶體與執行緒安全,因此新的核心程式碼能「依建構而安全」,而非「靠審慎審查而安全」。
具體而言,它為核心的建構系統加上 Rust 支援,並圍繞核心既有的 C 介面提供安全的 Rust 包裝(「綁定」),這樣一個以 Rust 撰寫的驅動程式就能透過 Rust 編譯器能推理的 API 呼叫進 C 核心。這個承諾是真的:在安全的 Rust 裡,借用檢查器會拒絕可能釋放仍在使用的記憶體、越界索引,或在未同步下跨執行緒共享可變資料的程式碼——一整類經典的核心漏洞根本無法通過編譯。最早併入 Linux 主線的 Rust 程式碼是基礎設施與少數幾個驅動程式,而這項努力刻意是漸進的:那龐大的既有 C 程式庫並未被重寫。
它之所以重要,是作為一個里程碑——第二種語言進入世上最重要也最保守的 C 程式庫之一,正面瞄準造成大多數核心安全漏洞的那一類臭蟲。但這裡的誠實正是重點所在。這是部分且持續進行的:核心大部分仍是 C,而 Rust 與 C 相接的邊界需要不安全的 Rust 與手寫的綁定,那裡編譯器的保證並不適用,一個失誤就能重新引入正是 Rust 本欲防範的臭蟲。Rust 的安全只對安全的程式碼成立;它擋不住邏輯錯誤、死結或洩漏,也不會回頭修好它周遭的 C。正確的解讀是「對新程式碼一種有前景、漸進的加固」,而非「核心如今已是記憶體安全的」。
// 安全的 Rust 核心程式碼:借用檢查器在編譯期拒絕整類臭蟲 // - 記憶體釋放後使用 -> 無法通過編譯 // - 索引超出切片結尾 -> 經邊界檢查 // 但 C 與 Rust 相接的邊界需要 `unsafe { ... }` + 手寫綁定, // 那裡編譯器的保證「不」適用,一個閃失就重新引入舊有的臭蟲
安全的 Rust 在編譯期消除經典記憶體臭蟲,但通往 C 核心那道無可避免的 unsafe 邊界,正是保證失效之處——這項工作確實是部分的。
這是漸進的,不是重寫:Linux 大部分仍是 C,而 C 通往 Rust 的邊界用的是 unsafe Rust,那裡安全保證並不成立。Rust 只在安全的程式碼中防範記憶體安全臭蟲——擋不住邏輯錯誤、死結或洩漏——所以「核心裡的 Rust」是對新程式碼的加固,而非核心如今已安全的主張。