MMAP_THRESHOLD バイトより大きいメモリ ブロックを割り当てる場合、glibc の malloc() 実装は、 mmap を使用してプライベートな匿名マッピングとしてメモリを割り当てます。この mmap 割り当て領域は、Linux vmaの[ヒープ]の一部にはなりません。
Linuxカーネルモジュールからすべてのglibc mmap領域を識別するために利用できる方法はありますか?
例 :
MMAP_THRESHOLD より大きい malloc を何度も実行するテスト プログラムの 1 つに、 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]";
}