Posted on

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の為の領域はどうやって確保している?

TODO

[[mmap]] はどうやってメモリを確保するのか(kernelの話)

heapをredare2でみたい

Consolidation: 合体

Tcaches Recharging

[[t-cache]] がわからない [[redare2]] #watchlater

参考文献