当我打印正在运行的进程的内容时,我得到了这样的结果
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分配了一个整数大小,但堆的大小显示的大于此值。为什么会这样?
答案 0 :(得分:2)
0x400000处的r-xp
区域是您的文本(代码)部分。它是可读的,可执行的,但不可写。
0x600000处的rw-p
区域是您的数据部分。它是可读写的,但不可执行。
readelf -S a.out
将显示可执行文件中的部分,以及它们将被加载到内存中的位置(首先通过部分到部分的映射。)
关于malloc
4个字节的实验是不够的,因为这不是内存管理的工作原理。当你调用malloc
时,你的libc实现将从它正在维护的大型池中分出一小块。 (这只是您的进程执行此操作 - 操作系统不会立即参与。)当您耗尽该池时,它将使用brk
(或mmap
)系统调用要求内核给它更多的内存。
如果malloc
内存量更大,您可能会看到堆增长。此外,您可以在可执行文件上运行strace
,并查看它实际进行brk
或memmap
系统调用的时间。