【问题标题】:Content of /proc/pid/maps/proc/pid/maps 的内容
【发布时间】:2013-09-26 02:17:56
【问题描述】:

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

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 分配了一个整数大小,但显示的堆大小不止于此。为什么会这样?

【问题讨论】:

    标签: linux process virtual-memory


    【解决方案1】:

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

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

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


    您关于mallocing 4 字节的实验是不够的,因为这不是内存管理的工作方式。当您调用malloc 时,您的 libc 实现将从它所维护的大型池中分出一小块。 (这只是 您的进程 这样做 - 操作系统不会立即参与。)当您耗尽该池时,它将使用 brk(或 mmap)系统调用来询问内核给它更多的内存。

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

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      相关资源
      最近更新 更多