後端工坊 2026 年 4 月 25 日

2026-04-25 — Linux 核心移除 AX.25/ATM/ISDN、Rust Sized trait RFC 3729、Box 優化記憶體

Linux 核心移除 AX.25、ATM、ISDN:AI 生…

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,如 strdyn 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),透過明確的邊界語法啟用更細緻的大小約束。

原始來源:LWN.net — One Sized trait does not fit all


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 等粗略指標。

原始來源:dystroy.org — Box to save memory


End of article
0
Would love your thoughts, please comment.x
()
x