2013-03-07 60 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