2013-09-26 14 views
0

當我打印正在運行的進程的內容,我得到了造成這樣內容的/ proc/PID /地圖

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分配了一個整數的大小,但是堆的大小顯示的更多。爲什麼這樣?

回答

2

r-xp 0x400000區域是您的文本(代碼)部分。它可讀,可執行,但不可寫。

在0x600000處的rw-p區域是您的數據部分。它是可讀寫的,但不可執行。

readelf -S a.out將向您展示部分在您的可執行文件,並在那裏他們將被加載到內存中(先通過部分以分段映射。)


您的實驗約malloc荷蘭國際集團的4個字節是不夠的,因爲這不是內存管理的工作方式。當您致電malloc時,您的libc實現將從它正在維護的大型池中分離出一小塊。 (這只是您的進程這樣做 - 操作系統不會立即涉及。)當您耗盡該池時,它將使用系統調用brk(或mmap)要求內核爲其提供更多內存。

如果你的內存容量大得多,你可能會看到堆增長。此外,您可以在您的可執行文件上運行strace,並查看它何時實際上進行了brkmemmap系統調用。