分段到/ proc / self / maps输出中的堆

时间:2010-11-23 20:01:03

标签: c operating-system linux-kernel virtual-memory

我的程序在执行的某个时刻逐行读取它自己的/ proc / self / maps,直到(并包括)堆。该程序的路径是“/ home / t4”。这是输出:

00400000-00403000 r-xp 00000000 68:06 21629911 /home/t4
00602000-00603000 r--p 00002000 68:06 21629911 /home/t4
00603000-00604000 rw-p 00003000 68:06 21629911 /home/t4
00604000-00608000 rw-p 00000000 00:00 0
01905000-01926000 rw-p 00000000 00:00 0 [heap]

我只期待四个部分:代码,常量,静态变量,堆;但在这里,有五个。第一个显然必须是代码,最后一个是堆。也许第二个是常数 - 但那么另外两个是什么?谢谢!

2 个答案:

答案 0 :(得分:2)

初始化的静态变量之后是未初始化的静态变量(.BSS) - 它们不需要存储在二进制文件中。

答案 1 :(得分:1)

第一个是可执行部分本身(由于x位),第二个可能是.rodata(缺少w位),第三个是其他所有(.bss和{{1} })。第四个是使用.data进行mmap调用的结果。请注意,使用MAP_ANONYMOUS(2)而不是malloc(2)可以很好地实现mmap(3)。 sbrk对象存在经典的sbrk-heap(仅限于此),并且不包括使用mmap获取的私有可写区域。传统的堆栈将被列为[heap],但是子堆栈可以使用任何内存区域来存储它们的堆栈,通常是malloc'd,所以你不会看到多个[stack] ...

混乱完成了吗? : - )