[malloc] 追いかける.
malloc 追いかける
その前に, [[20220314_malloc_movie]] を観た
mallocはメモリをチャンク(chunk)という単位で扱う。これは「ヘッダ+ユーザが使える領域」という形になっている。これはmalloc_chunkという構造体で、以下のように定義されている。
struct malloc_chunk
at glibc/malloc/malloc.c
双方向リスト, header + 自由に使えるメモリ領域
-
大きなメモリ確保の際は [[mmap]] 呼んでいる
- size + header_size + align_offset + page_size_offset
- glibcのalignmentは8byte
-
NOTE:
-static
つける([[gdb#^a345a9]])
gcc -g -static heap.c && ./a.out
gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b munmap
Breakpoint 1 at 0x451820
(gdb) r
Starting program: /mnt/d/home/wakame_tech/redare2-prac/a.out
page size = 0x1000
request size: 0x100000
obtained pointer: 0x7ffff7ef9010
size = 0x101002
Memory is mmapped.
offset = 0x0
chunk size = 0x101000
Breakpoint 1, 0x0000000000451820 in munmap ()
(gdb) print/x $rdi
$1 = 0x7ffff7ef9000
(gdb) print/x $rsi
$2 = 0x101000
疑問
mmap
を使わない小さなmallocの為の領域はどうやって確保している?
-
brk
syscallがあり, heap領域を拡張できる -
static変数として宣言されて起動時(のいつ?)に
brk
される?glibc
にもsbrk
はある
-
最初からheapはある程度ある
-
brk
とmmap
の使い分けの理由がわからないbrk
とても遅いのでなるべく呼ばない- 最悪swap出来るのでディスク容量までは要求できる
- Arena伸ばせるのか?
- 最悪swap出来るのでディスク容量までは要求できる
-
閾値は環境変数
-
前気になっていたheapの先頭を取得する方法,
brk(NULL)
する
TODO
[[mmap]] はどうやってメモリを確保するのか(kernelの話)
heapをredare2でみたい
Consolidation: 合体
Tcaches Recharging
[[t-cache]] がわからない [[redare2]] #watchlater