Я понял, что при выделении блоков памяти, превышающих байты MMAP_THRESHOLD, реализация glibc malloc() выделяет память как частное анонимное сопоставление с использованием mmap, и эта выделенная область mmap не будет частью [heap] в линукс вма.
Итак, существует ли какой-либо метод для идентификации всех областей mmap glibc из модуля ядра Linux?
пример :
Одна из тестовых программ, которая много раз делает 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]";
}
mmap
? - person Basile Starynkevitch   schedule 08.10.2012