2011-11-02 33 views
5

如果我MMAP()一些PRIVATE匿名頁面,然後將它們與延伸mremap(),做了新的空間也得到初始化爲0?mremap是否在增長時「初始化」內存?

我試過在Linux源碼中讀取mremap的代碼(mm/mremap.c),但它需要一些我目前沒有的領域特定知識(vma _ ### stuff)。甚至不知道那是看在正確的地方...

但是,從我收集我認爲mremap()的內存將被清除,這是正確的?

分配是這樣

list = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 

完成,然後重新映射是這樣

newList = mremap(list, oldSize, newSize, MREMAP_MAYMOVE) 

啊完了,最後,這是一個的Linux具體問題,運行最新的內核( > = 2.6.28)和libc(> = 2.11.1)

回答

4

匿名頁面是寫時複製映射一個通用零頁面。他們總是(在每個系統上,不僅僅是Linux,提供匿名映射),並且一直都是如此。當mremap(或brk)擴展了匿名映射時,您將獲得新的匿名(零)頁面。沒有必要自己初始化它們。

+0

是的。除零頁以外的任何內容都會成爲安全漏洞。 –

+0

您錯誤地瞭解了通用零頁的寫時複製映射。至少在Linux上,這不是'mmap()'的工作方式。您可以將物理頁面映射到對映射內存的第一次訪問,並且這是內核頁面錯誤處理程序,可將物理頁面歸零並將其映射。沒有涉及通用的零頁面。 –

+1

你確定嗎?當然,對於只讀匿名映射,它不會爲每個頁面創建一個物理頁面。如果您啓用重複頁面的合併,我所說的肯定是對的,但我可能一般都是錯的;我沒有RTFS'd或測試過它。 –

相關問題