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

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

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

答案1

我认为你指的是VirtualAlloc朋友们。据我所知,Linux 中没有直接等效的方法,但您可以通过多种方式实现相同的效果。如果你想保留内存,你可以使用mmap(2);要提交它,您需要写入它;要解除它,您可以使用madvise(2)MADV_DONTNEED.

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

答案2

如果您只是想调试自己的程序,而不是实现复杂的内存管理器,我建议您简单地使用诸如瓦尔格林德检测内存泄漏和悬空指针。

相关内容