
是否可以從應用程式明確控制記憶體頁面提交?許多年前,在 Windows 應用程式中,我編寫了一個「警報系統」堆管理器來幫助我找到隨機懸空引用/堆損壞錯誤。我能夠保留大面積的虛擬內存,然後隨意提交/取消提交頁面。當時的想法是創建一個包含未提交頁面的集合,後面是一個或多個已提交頁面(足以滿足請求),最後是另一個未提交頁面;使用編譯時標誌來控制傳回給呼叫者的指標是否位於已提交區域的開頭或結尾(分別在下寫或覆寫時立即觸發異常)。 Windows 提供了用於保留記憶體區域和提交頁面的 API。在我正在編寫的 Linux 程式中,這樣的書尾緩衝區還有另一種用途,我想知道核心是否提供相同類型的功能。
答案1
我認為你指的是VirtualAlloc
和朋友們。據我所知,Linux 中沒有直接的等效項,但您可以透過多種方式實現相同的效果。如果你想保留內存,你可以使用mmap(2)
;要提交它,您需要寫入它;要解除它,您可以使用madvise(2)
的MADV_DONTNEED
.
要實現保護頁面,您可能會發現mprotect(2)
與處理程序一起成為更好的選擇SIGSEGV
。您也可以查看編譯器提供的溢位保護(-fstack-protector
等等,以及各種-fsanitize
選項)。
答案2
如果您只是想調試自己的程序,而不是實現複雜的記憶體管理器,我建議您簡單地使用諸如瓦爾格林德檢測記憶體洩漏和懸空指標。