从Linux内核模块中识别glibc mmap区域(VMA)

时间:2012-10-08 09:47:06

标签: linux memory-management linux-kernel mmap

我理解当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap将内存分配为私有匿名映射,并且此mmap分配区域不会作为 [heap]的一部分出现在linux vma。

那么有没有方法可以从linux内核模块中识别出所有glibc mmap区域。?

示例:

多次执行malloc大于MMAP_THRESHOLD的测试程序之一显示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]";
 }

1 个答案:

答案 0 :(得分:0)

我相信你不应该从内核模块转储你的应用程序的内存。您应该考虑使用application checkpointing,请参阅this answerBerkley checkpoint restart library

您还可以考虑在内核中使用core转储工具。