我理解当分配大于 MMAP_THRESHOLD 字节的内存块时,glibc malloc() 实现使用 mmap 将内存分配为私有匿名映射,并且这个 mmap 分配区域不会作为linux vma中[heap]的一部分。
那么是否有任何方法可以从 linux 内核模块中识别所有 glibc mmap 区域。?
例子 :
多次执行大于 MMAP_THRESHOLD 的 malloc 的测试程序之一显示 cat /proc/pid/maps 输出为
00013000-00085000 rw-p 00000000 00:00 0 [heap]
40000000-40016000 r-xp 00000000 00:0c 14107305 /lib/arm-linux-gnueabi/ld-2.13.so
4025e000-4025f000 r--p 00001000 00:0c 14107276 /lib/arm-linux-gnueabi/libdl-2.13.so
4025f000-40260000 rw-p 00002000 00:0c 14107276 /lib/arm-linux-gnueabi/libdl-2.13.so
.....
.....
40260000-40261000 ---p 00000000 00:00 0
40261000-40a60000 rw-p 00000000 00:00 0
40a60000-40a61000 ---p 00000000 00:00 0
40a61000-42247000 rw-p 00000000 00:00 0
beed8000-beef9000 rw-p 00000000 00:00 0 [stack]
在这几个(40a61000-42247000,40261000-40a60000)实际上是glibc mmap区域,那么从Linux内核模块有没有办法识别这些区域,比如下面的代码识别堆栈和堆?
if (vma->vm_start <= mm->start_brk &&
vma->vm_end >= mm->brk) {
name = "[heap]";
} else if (vma->vm_start <= mm->start_stack &&
vma->vm_end >= mm->start_stack) {
name = "[stack]";
}