2013-10-15 42 views
0

我可以在/ proc/$ PID/maps文件中(通過猜測或藉助特定段的訪問說明符)識別文本,ds和bss段。但堆和堆棧段是順序的。有沒有辦法確定哪個段屬於堆棧,哪些屬於堆?

-----如何確定堆間的分界並且在該示例堆疊---------- 0a8a0000-0ab2e000 RW-P 0a8a0000 00:00 0 [堆]
< b648e000 -b648f000 --- p b648e000 00:00 0
< b648f000-b6496000 RW-p b648f000 00:00 0
< b6496000-b6497000 --- p b6496000 00:00 0
< b6497000-b649e000 RW-p b6497000 00:00 0
< b649e000-b649f000 --- p b649e000 00:00 0
< b649f000-b64a6000 RW-P b649f000 00:00 0
< b64a6000-b64a7000 --- p b64a6000 00:00 0
< b64a7000-b64ae000 RW-P b64a7000 00:00 0
< b64ae000-b64af000 --- p b64ae000 00: 00 0
< b64af000-b657a000 RW-p b64af000 00:00 0
< b657a000-b657b000 --- p b657a000 00:00 0
< b657b000-b65a5000 RW-p b657b000 00:00 0
< b65a5000- b65a6000 --- p b65a5000 00:00 0
< b65a6000-b67ca000 rw-p b65a6000 00:00 0
< b67ca000-b67cb000 --- p b67ca000 00:00 0
< b67cb000-b69ff000 RW-P b67cb000 00:00 0
< b69ff000-b6a00000 --- p b69ff000 00:00 0
< b6a00000-b6bff000 RW-p b6a00000 00:00 0
< b6bff000-b6c00000 --- p b6bff000 00:00 0
< b6c00000-b6dff000 RW-p b6c00000 00:00 0
< b6dff000-b6e00000 --- p b6dff000 00: 00 0
< b6e00000-b6fff000 rw-p b6e00000 00:00 0
< b6fff000-b7000000 --- p b6fff000 00:00 0
< b7000000-b70fd000 RW-P b7000000 00:00 0
< b70fd000-b70fe000 --- p b70fd000 00:00 0
< b70fe000-b72fd000 RW -p b70fe000 00:00 0
< b72fd000-b72fe000 --- p b72fd000 00:00 0
< b72fe000-b7548000 RW-p b72fe000 00:00 0
< b7548000-b7549000 --- p b7548000 00:00 0
< b7549000-b7f37000 rw-p b7549000 00:00 0
< b7f4b000-b7f4c000 --- p b7f4b000 00:00 0
< b7f4c000-b7f51000 RW-P b7f4c000 00:00 0
< bfbae000-bfbc3000 RW-P bffea000 00:00 0 [堆]

+0

堆棧段是唯一標記的[[stack]]。每個其他可寫段都是堆,幾乎是按照定義。否則,請給我們您*堆的確切定義* –

+0

「段」是20年前相關的術語。任何現代系統都比文獻給出的簡單的「代碼/數據/堆/棧段」描述複雜得多。在線程應用程序中,您將擁有與線程一樣多的堆棧,堆不必是連續的,您將擁有大量數據與代碼和只讀數據以及共享庫中的輔助數據和PLT和GOT混合在一起,內存映射文件,由內核維護的特殊代碼映射,守衛頁面等。 – Art

+0

[Understanding Linux /proc/id/maps](http://stackoverflow.com/questions/1401359/understanding-linux-proc- id-maps) – gavv

回答

4

包含當前映射的內存區域和其訪問權限的/ proc/PID/maps文件。

的格式是:

address   perms offset dev inode  pathname 

08048000-08049000 r-xp 00000000 03:00 8312  /opt/test 
08049000-0804a000 rw-p 00001000 03:00 8312  /opt/test 
0804a000-0806b000 rw-p 00000000 00:00 0   [heap] 
a7cb1000-a7cb2000 ---p 00000000 00:00 0 
a7cb2000-a7eb2000 rw-p 00000000 00:00 0 
a7eb2000-a7eb3000 ---p 00000000 00:00 0 
a7eb3000-a7ed5000 rw-p 00000000 00:00 0   [stack:1001] 
a7ed5000-a8008000 r-xp 00000000 03:00 4222  /lib/libc.so.6 
a8008000-a800a000 r--p 00133000 03:00 4222  /lib/libc.so.6 
a800a000-a800b000 rw-p 00135000 03:00 4222  /lib/libc.so.6 
a800b000-a800e000 rw-p 00000000 00:00 0 
a800e000-a8022000 r-xp 00000000 03:00 14462  /lib/libpthread.so.0 
a8022000-a8023000 r--p 00013000 03:00 14462  /lib/libpthread.so.0 
a8023000-a8024000 rw-p 00014000 03:00 14462  /lib/libpthread.so.0 
a8024000-a8027000 rw-p 00000000 00:00 0 
a8027000-a8043000 r-xp 00000000 03:00 8317  /lib/ld-linux.so.2 
a8043000-a8044000 r--p 0001b000 03:00 8317  /lib/ld-linux.so.2 
a8044000-a8045000 rw-p 0001c000 03:00 8317  /lib/ld-linux.so.2 
aff35000-aff4a000 rw-p 00000000 00:00 0   [stack] 
ffffe000-fffff000 r-xp 00000000 00:00 0   [vdso] 

其中「地址」是在它佔據「燙髮」 是一組權限的進程的地址空間:

r = read 
w = write 
x = execute 
s = shared 
p = private (copy on write) 

「偏移」是映射的偏移量,「dev」是設備(major:minor),並且「inode」是該設備上的inode。 0表示沒有inode與內存區域關聯 ,就像BSS(未初始化的數據)一樣。 「路徑名」顯示該映射的名稱關聯文件。如果映射 不與文件相關聯:

[heap]     = the heap of the program 
[stack]     = the stack of the main process 
[stack:1001]    = the stack of the thread with tid 1001 
[vdso]     = the "virtual dynamic shared object", 
          the kernel system call handler 

,或者爲空,映射是匿名的。 (來源https://www.kernel.org/doc/Documentation/filesystems/proc.txt

+0

你的意思是說只有那些標記爲'[堆]'的段/頁屬於堆段?但@ basile-starynkevitch說只有那些標記爲'[stack]'的段/頁屬於堆棧,而其他所有屬於堆段?我很困惑... – gulam

+0

如果任務將它視爲堆棧,您將看到標記[stack]。如果它的堆將顯示[堆] ....文件清楚地提到了這一點。 –

+1

如果是這種情況,那麼爲什麼操作系統應該爲進程分配如此多的「匿名段」(堆棧和堆除外)呢? – gulam