определение областей glibc mmap (VMA) из модуля ядра Linux

Я понял, что при выделении блоков памяти, превышающих байты 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]";
 }

person Abhilash V R    schedule 08.10.2012    source источник
comment
Почему вы спрашиваете, и почему вы фокусируетесь на сегментах GNU Libc, но не заботитесь о сегментах других библиотек? Почему вы не можете одинаково обрабатывать все анонимные mmap?   -  person Basile Starynkevitch    schedule 08.10.2012
comment
@ В основном я хочу сбросить всю выделенную область моего приложения из модуля ядра, поэтому я хочу различать области malloc mmap   -  person Abhilash V R    schedule 09.10.2012


Ответы (1)


Я считаю, что вы не должны сбрасывать память вашего приложения из модуля ядра. Вам следует рассмотреть возможность использования контрольных точек приложения, см. этот ответ и библиотека перезапуска контрольной точки Berkley

Вы также можете рассмотреть возможность использования core средств создания дампа внутри ядра.

person Basile Starynkevitch    schedule 09.10.2012