Linux保留堆大小

时间:2012-09-11 13:27:48

标签: linux linux-kernel kernel

我注意到在2.6.32 MIPS内核上,内存布局总是一样的。对于大多数进程(或者至少是我查看的进程),这个程序的堆开始于0x10146000。另一个相似之处是/lib32/ld-2.9.so始终始于2aaa8000

所以基本上堆已经在虚拟内存中保留了所有这些大小,我想修改它,因为似乎在某些时候如果我用完虚拟内存(在地址空间的其余部分)mmap将尝试在上面提到的空间中映射失败,尽管堆只有几MB。现在有人在哪里设置这个地址吗?

1 个答案:

答案 0 :(得分:2)

如果你查看arch/mips/mm/mmap.c,你会发现在Linux中存在两种记忆方式,选择的方式取决于mmap_is_legacy的返回值,而这又取决于你是否拥有启用无限堆栈(强制传统模式)以及编译的二进制文件是否为PT_GNU_STACK标志(没有此设置强制兼容模式)。新布局已添加到2.6.7中,并在http://lwn.net/Articles/90311/中进行了描述。

简单地说旧布局如下:

| CODE ---- | HEAP ----------> | MMAP ------>  | <-------- STACK |
| 0GB       |                  | 2GB/3         |             2GB |

新布局如下所示:

| CODE ---- | HEAP ----------> | <------------- MMAP | --- STACK |
| 0GB       |                  |             2GB-8MB |       2GB |

请注意,在旧布局中,堆和mmap区域之间存在固定的划分,而在新区域中,它是灵活的。您可能正在运行缺少新模式的旧内核,或者您正在以前所述的兼容模式运行。

请注意,您找到的地址是0x2AAA8000大约是2GB / 3(libc是第一个被映射的东西),0x10146000大约是256MB(这足以适合您的程序的代码,数据和未初始化的数据段)。