mprotect并不总是折叠/ proc / pid / maps中的相邻行

时间:2013-07-27 09:29:12

标签: linux mprotect

我有一个过程,经过一段时间后,对mprotect()的调用失败并显示ENOMEM。该错误是由“无法分配内部内核结构”引起的:此时,文件/proc/<pid>/maps包含65531行,当然可疑地接近2 ^ 16。

该过程首先使用mmap(1280MB,MAP_PRIVATE | MAP_ANONYMOUS)获取一块内存,然后在单页(或少量页面)上调用mprotect()以启用和禁用对它们的访问,以进行调试。 1280MB mmaped区域最初在/proc/<pid>/maps中显示为单行,但每次调用mprotect()都可能将此区域“拆分”为三个:前一个内存,修改后的页面和后面的内存。经过多次更改后,当两个相邻(但独立修改)的内存区域以相同的访问标志结束时,它们通常会再次合并,因此总行数保持合理。

但只是“通常”。在失败的情况下,/proc/<pid>/maps最终会有大量具有相同保护的连续内存区域,我不明白为什么它们没有合并。在单页示例中,它们已正确合并。它什么时候有所不同?为什么?

作为参考,失败的程序是多线程的,虽然这不应该有效(对于每个线程,/proc/<tid>/maps文件是相同的)。看看Linux内核“2.6.35-30-generic#56-Ubuntu SMP”和“3.2.0-37-generic#58-Ubuntu SMP”。

编辑:如何重现:

hg clone https://bitbucket.org/pypy/stmgc
cd stmgc/c4
hg up d4e3aac8c458     # branch copy-over-original2
make debug-demo2
gdb ./debug-demo2      # lots and lots of colored output

它应该在err = mprotect(..); assert(err == 0);

失败

0 个答案:

没有答案