0

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

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

4

1 回答 1

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(这足以容纳您的程序的代码、数据和未初始化的数据段)。

于 2012-09-21T11:02:09.163 回答