应用程序可以显式提交和取消提交内存吗?

Jac*_*ton 4 memory virtual-memory

是否有可能 - 从应用程序 - 显式控制内存页面提交?多年前,在一个 Windows 应用程序中,我编写了一个“警报系统”堆管理器来帮助我找到一个随机悬空引用/堆损坏错误。我能够保留大面积的虚拟内存,然后随意提交/取消提交页面。当时的想法是创建一个包含一个未提交页面的集合,然后是一个或多个已提交的页面(足以满足请求),然后是另一个未提交的页面;使用一个编译时标志来控制返回给调用者的指针是在提交区域的开头还是结尾(分别在覆盖或覆盖时立即触发异常)。Windows 提供了用于保留内存区域和提交页面的 API。

Ste*_*itt 6

我认为你指的是VirtualAlloc朋友。据我所知,Linux 中没有直接的等价物,但您可以通过多种方式实现相同的效果。如果要保留内存,可以使用mmap(2); 要提交它,你需要写信给它;要取消提交,您可以使用madvise(2)'s MADV_DONTNEED

要实现保护页面,您可能会发现mprotect(2)SIGSEGV处理程序一起使用是更好的选择。您还可以查看编译器提供的溢出保护(-fstack-protector等等,以及各种-fsanitize选项)。