Linux 5.12 核心採用了 KFence 子系統來偵測使用記憶體時的錯誤

正在開發的 Linux 核心 5.12 包含 KFence(內核電子圍欄)機制的實現,該機制檢查記憶體處理、捕獲緩衝區溢位、釋放後的記憶體存取以及類似類別的其他錯誤。

類似的功能已經以 KASAN 構建選項的形式存在於內核中(內核地址清理程序,在現代 gcc 和 clang 中使用地址清理程序) - 然而,它主要用於調試用途。 KFence 子系統與 KASAN 的不同之處在於其高運行速度,這使得即使在工作系統的核心上也可以使用此功能。

生產系統上的應用程式將能夠捕獲在測試運行中不會出現、僅在工作負載或長期運行(正常運行時間較長)期間出現的記憶體錯誤。 此外,在生產系統上使用KFence將可大幅增加使用記憶體檢查核心運作情況所涉及的機器數量。

KFence 透過以固定間隔將保護頁插入堆中來實現最小的與負載無關的開銷。 下一個保護間隔到期後,KFence 透過標準記憶體分配系統(SLAB 或 SLUB 分配器)從 KFence 物件池中新增下一個保護頁,並啟動新的時間計數器報告。 每個KFence物件位於單獨的記憶體頁中,左右邊界的記憶體頁形成保護頁,其大小是隨機選擇的。

因此,具有物件的頁面透過保護頁面彼此分開,保護頁面被配置為在任何存取時產生「頁面錯誤」。 為了檢測物件頁面內的越界寫入操作,還使用了基於模式的“紅色區域”,它們佔用物件未使用的內存,在內存頁面大小對齊時剩餘。 —+————+————+————+————+————+— | xxxxxxxxx | 哦:| xxxxxxxxx | :哦| xxxxxxxxx | | xxxxxxxxx | 乙: | xxxxxxxxx | :B | xxxxxxxxx | | x 守衛 x | J : 紅色- | x 守衛 x | 紅色-:J | x 守衛 x | | xxxxxxxxx | E:區域| xxxxxxxxx | 區域:E | xxxxxxxxx | | xxxxxxxxx | C:| xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | 電話:| xxxxxxxxx | :T | xxxxxxxxx | —+————+————+————+————+————+—

如果嘗試存取緩衝區邊界之外的區域,該操作會影響保護頁面,從而導致產生“頁面錯誤”,該錯誤會攔截 KFence 並記錄有關檢測到的問題的資訊。 預設情況下,KFence 不會阻止錯誤,僅在日誌中顯示警告,但有一個「panic_on_warn」設置,可讓您在偵測到錯誤時將核心置於恐慌狀態。

來源: opennet.ru

添加評論