在pmap的结果中堆VS anon内存

时间:2010-01-28 00:52:00

标签: heap solaris

以下是在solaris上运行后的结果,它显示有两个堆,但在我的理解中,对于一个进程,只有一个堆是一个大的连续内存,可以由brk管理以扩展或收缩尺寸。对于anon内存,进程可以有许多anon内存,可以由mmap / munmap管理。我的理解是否正确?或者我错误地读了pmap的结果?

sol9 #pmap -sx pgrep testprog

... 00022000 3960 3960 3960 - 8K rwx-- [heap]

00400000 131072 131072 131072 - 4M rwx-- [heap]

... FF390000 8 8 - - 8K r-x-- libc_psr.so.1

FF3B0000 8 8 8 - 8K rwx-- [anon]

...


总Kb 135968 135944 135112 -

1 个答案:

答案 0 :(得分:4)

你是正确的并且误读了pmap输出。如果你已经完成了pmap -x,结果可能会更少混淆,只显示一次堆,但是由于你添加了-s标志,它会将堆分解为具有不同页面映射的段。

从0x0022000开始的地址未正确对齐以映射到4Mb页面,因此它们使用3960kb的8k页面。 0x0022000 +(3960 * 1024)= 0x00400000

在0x00400000处,地址已正确对齐4Mb页面,因此堆切换到使用较少页表条目的较大页面。

如果你想确保你的堆开始正确对齐以使用4Mb页面而不是以8k开始直到它到达对齐边界,那么你将链接你的程序与-M /usr/lib/ld/map.bssalign做这一点。

可以在Page Size and Memory Layout blog post作者Solaris Application ProgrammingDarryl Gove中找到更深入的解释。