2013-03-07 61 views
2

我有一個應用程序,使用MEM_RESERVE標誌在Windows上使用VirtualAllocEx保留一個連續的內存塊。這保留了一個虛擬內存塊,但不支持物理頁面或頁面文件塊。因此,訪問分配的內存將導致分段錯誤 - 但其他分配不會與此虛擬內存塊相交。如何在Linux中保留虛擬內存?

如何使用mmap對Linux進行相同操作?我確實注意到this question中的答案,但是如果我不觸摸分配的頁面,是否真的能保證說1 GB的物理內存不會分配給我的進程?我不想要任何顛簸問題。

回答

5

我相信你應該可以通過將匿名內存映射到PROT_NONE來實現同樣的效果。訪問PROT_NONE內存將導致段錯誤,但內存區域將被保留,不用於任何其他目的。如果您想分配一大塊內存,請添加MAP_NORESERVE以確保默認的overcommit機制不會檢查您的分配。

PROT_NONE通常用於堆棧末尾的「保護」頁面。

+0

+1我認爲這是要走的路 – slezica 2013-03-07 01:47:14

+0

這是一個非常有趣的技術。通過使用'mmap(2)'+'PROT_NONE',你在Windows上基本上具有'VirtualAlloc()'+'MEM_RESERVE'的相同效果。我更關心'MAP_NORESERVE'標誌:一旦你需要頁面,你可以用'mprotect(2)'設置'PROT_READ | PROT_WRITE'(這就像調用VirtualAlloc()'+ MEM_COMMIT '),一旦你指定了對'mmap(2)'的調用,你就不能重置標誌'MAP_NORESERVE',所以你的內存永遠都會被設置爲「no reserve」,即使是「提交」。你會如何解決這個怪癖? – 2015-07-28 11:10:19