0
votes

I understood When allocating a blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap ,and this mmap allocated area wont come as a part of [heap] in linux vma.

So is there any method available to identify all the glibc mmap areas from a linux kernel module.?

example :

One of test program which do malloc greater than MMAP_THRESHOLD many times shows cat /proc/pid/maps output as

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]

In this few are (40a61000-42247000,40261000-40a60000) actually glibc mmap areas,So from a Linux kernel module is there any way to identify this areas ,something like below code which identify stack and heap ?

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
Why do you ask, and why do you focus on GNU Libc's segments but don't care about other libraries' segments? Why can't you handle all anonymous mmap-ing equivalently?Basile Starynkevitch
@Basically i want to dump entire allocated area of my application from the kernel module,that why i want to differentiate malloc mmap areasAbhilash V R

1 Answers

0
votes

I believe you should not dump the memory of your application from a kernel module. You should consider using application checkpointing, see this answer and the Berkley checkpoint restart library

You could also consider using the core dumping facilities inside the kernel.