0

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]";
 }
4

1 に答える 1