/ proc / pid / maps的内容

时间:2013-09-26 02:17:57

标签: linux process virtual-memory

当我打印正在运行的进程的内容时,我得到了这样的结果

00400000-00401000 r-xp 00000000 08:01 137910                             /home/user/process/a.out
00600000-00601000 rw-p 00000000 08:01 137910                             /home/user/process/a.out
02434000-02455000 rw-p 00000000 00:00 0                                  [heap]

为什么在两个内存区域加载a.out?它是相同的部分还是不同的部分。一个人得到r-xp而其他人得到rw-p。尽管我在程序中使用malloc分配了一个整数大小,但堆的大小显示的大于此值。为什么会这样?

1 个答案:

答案 0 :(得分:2)

0x400000处的r-xp区域是您的文本(代码)部分。它是可读的,可执行的,但不可写。

0x600000处的rw-p区域是您的数据部分。它是可读写的,但不可执行。

readelf -S a.out将显示可执行文件中的部分,以及它们将被加载到内存中的位置(首先通过部分到部分的映射。)


关于malloc 4个字节的实验是不够的,因为这不是内存管理的工作原理。当你调用malloc时,你的libc实现将从它正在维护的大型池中分出一小块。 (这只是您的进程执行此操作 - 操作系统不会立即参与。)当您耗尽该池时,它将使用brk(或mmap)系统调用要求内核给它更多的内存。

如果malloc内存量更大,您可能会看到堆增长。此外,您可以在可执行文件上运行strace,并查看它实际进行brkmemmap系统调用的时间。