第31章 ヒープのヘッダーオブジェクト( heap_info )

 スレッドアリーナのヒープの先頭には heap_info オブジェクトが配置されます。

img/multiple_heaps.png

 ヒープは図の通り各アリーナに複数存在することができます。

arena.c(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/malloc/arena.c). 

 49 /* A heap is a single contiguous memory region holding (coalesceable)
 50    malloc_chunks.  It is allocated with mmap() and always starts at an
 51    address aligned to HEAP_MAX_SIZE.  */
 52
 53 typedef struct _heap_info
 54 {
 55   mstate ar_ptr; /* Arena for this heap. */
 56   struct _heap_info *prev; /* Previous heap. */
 57   size_t size;   /* Current size in bytes. */
 58   size_t mprotect_size; /* Size in bytes that has been mprotected
 59                            PROT_READ|PROT_WRITE.  */
 60   /* Make sure the following data is properly aligned, particularly
 61      that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of
 62      MALLOC_ALIGNMENT. */
 63   char pad[-6 * SIZE_SZ & MALLOC_ALIGN_MASK];
 64 } heap_info;

 ar_ptr は各ヒープが指しているアリーナへのポインターです。

 mstate は malloc_state オブジェクトを指すポインターとなります。

malloc.h(https://github.com/MacKomatsu/glibc/blob/release/2.27/master/include/malloc.h). 

 14 struct malloc_state;
 15 typedef struct malloc_state *mstate;

 つまり mstate 型の ar_ptr はアリーナが開始するアドレスを指してるってことになります。

Copyright 2018-2019, by Masaki Komatsu