Linux 核心移除 AX.25、ATM、ISDN:AI 生成安全報告超載老舊子系統維護者
LWN.net · 2026-04-22
Linux 核心開發社群正在進行一場前所未有的大規模遺留程式碼清除行動,直接導火線是大量由語言模型自動生成的安全漏洞報告。核心維護者面對排山倒海的 syzbot 回報,在無法找到願意接手的維護者情況下,選擇了最直接的解法:把整個子系統移出核心樹。
受影響子系統
- AX.25、NET/ROM、ROSE:業餘無線電封包通訊協定,源自 1990 年代
- ATM 協定與驅動程式:非同步傳輸模式網路支援
- ISDN 子系統:整合服務數位網路
- ISA 與 PCMCIA 乙太網路驅動程式
- 特定 PCI 驅動程式
問題的技術根源
syzbot 是 Google 維護的持續核心模糊測試(fuzzing)基礎設施,會自動向相關子系統的維護者郵件列表送出崩潰報告。隨著 LLM 輔助漏洞分析工具的普及,掃描工具自動對遺留程式碼生成的漏洞報告數量呈指數增長。
提議移除的 patch 系列說明直接點明:「這組協定長期以來一直是大量 bug/syzbot 報告的磁石,由於沒有人站出來處理 AI 生成的 bug 報告潮,我們需要把它移出樹。」
社群討論的張力
此議題暴露了開源核心開發的幾個結構性問題。一方面,這些協定幾十年沒有活躍維護者,繼續留在核心樹只會成為攻擊面;另一方面,工業控制設備與業餘無線電社群仍有真實的使用需求,設備壽命動輒二三十年。
對於 AX.25,業餘無線電社群的傾向是遷移到使用者空間解決方案如 Direwolf,而非維持核心層支援。ATM 和 ISDN 則更接近純歷史文物,幾乎不存在現代硬體。
更廣泛的影響
此趨勢是 LLM 工具進入安全研究工作流後的系統性後果:自動化可以讓發現問題的成本降至接近零,但修復成本由人類承擔,形成不對稱壓力。對無人維護的程式碼而言,移除比維護更符合整體工程理性。
原始來源:LWN.net — Kernel code removals driven by LLM-created security reports
Rust RFC 3729:Sized trait 層級體系,解決編譯時大小語意的分裂問題
LWN.net · 2026-04-22
Rust 的型別系統長期以來只有一個 Sized trait,標記一個型別在編譯期已知固定大小。RFC 3729 提議引入 Sized trait 層級體系,為不同編譯時情境下的大小語意提供精確工具,解決現有設計的表達力缺口。
現有問題
目前 Sized 是一個自動實作的 marker trait,當型別的大小在編譯期可知時自動滿足。但現代 Rust 程式碼面對幾個 Sized 無法精確表達的情境:
- 泛型函數需要 有條件 地要求型別可調整大小
- DST(Dynamically Sized Types,如
str、dyn Trait)在某些上下文合法,另一些則不 - 未來的自訂 DST 功能需要更細緻的 sizing 語意
RFC 3729 的提案
RFC 3729 將單一 Sized 拆分為三個 trait 的層級:
Pointee:最底層,表示型別可以被指向(pointed to),不要求固定大小MetaSized:型別的元資料(metadata)大小已知,DST 可滿足Sized:現有語意保留,固定大小
這個層級體系讓程式設計師能在不同精度上約束泛型參數,例如允許接受 DST 的函數簽名,同時在需要 on-stack 配置的場合繼續要求完整 Sized。
向後相容策略
RFC 的設計維持現有 Sized 語意,讓幾乎所有現有程式碼無需修改。新的 trait bound 是選擇性加入(opt-in),透過明確的邊界語法啟用更細緻的大小約束。
Rust 記憶體優化技巧:Box 化 Option 大型結構體節省 53% 堆積空間
dystroy.org · 2026-04-24
在 Rust 中反序列化大型 JSON 資料時,一個不起眼的型別選擇可以造成數百 MB 的記憶體差異。這篇文章以 AWS SDK Smithy 形狀定義為實例,展示將 Option<LargeStruct> 改為 Option<Box<LargeStruct>> 如何從 895 MB 降至 420 MB(節省 53%)。
問題的根源:Rust 的記憶體佈局語意
Rust 的結構體與 Java/Python 不同——複合型別的欄位直接內嵌在父結構體中,不走指標間接。這意味著 Option<BigStruct> 即使值為 None,仍然佔用 size_of::<BigStruct>() 個位元組(加上 discriminant)。
例如,每個 Option<String> 欄位在 64 位元系統上佔 24 bytes:String 本身是 (ptr, len, capacity) 三個 usize。當結構體有十幾個這樣的欄位,且大多數情況下都是 None 時,大量空間被浪費。
解法
將型別改為 Option<Box<BigStruct>>,讓資料移至堆積:
None狀態只佔 8 bytes(一個 pointer-sized null)Some(_)時在堆積分配結構體,父結構只存指標
實作時需要自訂反序列化邏輯,在 deserializer 層面判斷「所有欄位都是空值」時直接返回 None,避免配置空殼結構體。
量測方法
作者使用 jemalloc 分配器配合 Cargo feature flag 切換,透過其記憶體分析 API 精確測量 before/after 的堆積使用量,避免依賴作業系統 RSS 等粗略指標。