【问题标题】:How can I reserve virtual memory in Linux?如何在 Linux 中保留虚拟内存?
【发布时间】:2013-03-07 01:38:04
【问题描述】:

我有一个应用程序在 Windows 上使用带有 MEM_RESERVE 标志的 VirtualAllocEx 保留一个连续的内存块。这会保留一个虚拟内存块,但不会用物理页面或页面文件块支持它。因此,访问分配的内存将导致分段错误——但其他分配不会与此虚拟内存块相交。

如何使用 mmap 为 Linux 做同样的事情?我确实注意到this question 中的答案,但这真的保证说,如果我不触摸分配的页面,1 GB 的物理内存不会分配给我的进程吗?我不想要任何颠簸的问题。

【问题讨论】:

    标签: linux windows mmap


    【解决方案1】:

    我相信您应该能够通过使用PROT_NONE 映射匿名内存来实现相同的目的。访问PROT_NONE 内存将导致段错误,但内存区域将被保留,不会用于任何其他目的。如果你想分配一个很大的内存块,添加MAP_NORESERVE以确保默认的overcommit机制不会检查你的分配。

    PROT_NONE 通常用于堆栈末尾的“保护”页面。

    【讨论】:

    • 这是一个非常有趣的技术。通过使用mmap(2) + PROT_NONE,您基本上可以在Windows 上获得与VirtualAlloc() + MEM_RESERVE 相同的效果。我更关心MAP_NORESERVE 标志:虽然您可以在需要页面时将PROT_READ|PROT_WRITE 设置为mprotect(2)(这就像调用VirtualAlloc()+MEM_COMMIT),但您似乎不能一旦您将标志MAP_NORESERVE 指定为对mmap(2) 的调用,则重置标志,因此您的内存将永远设置为“无保留”,即使“已提交”也是如此。你会如何解决这个怪癖?
    • 我认为最干净的解决方案是使用 MAP_FIXED 和要分配/提交的区域的地址/大小再次调用 mmap。如果您使用MAP_FIXED,则完全可以在现有区域之上进行 mmap(替换该区域中的任何现有映射),这是更改无法通过 mlock/mprotect 的某种组合更改的 mmap 标志的常用方法。
    猜你喜欢
    • 2016-04-29
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2018-09-21
    • 2014-01-16
    • 2012-06-22
    相关资源
    最近更新 更多