Где heap_info отображается в памяти? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь определить, как работают внутренние компоненты кучи.Специально теперь функция и общее расположение структуры heap_info.

Я понимаю основную функцию и как найти main_arena.Я понимаю, что есть структура heap_info, которая может содержать указатели на main_arenas?

Как видно из glibc-2.23, функция new_heap использует ее для создания новых куч:

 535 static heap_info *
 536 internal_function
 537 new_heap (size_t size, size_t top_pad)
 538 {
 539   size_t pagesize = GLRO (dl_pagesize);
 540   char *p1, *p2;
 541   unsigned long ul;
 542   heap_info *h;
...

99   if (__mprotect (p2, size, PROT_READ | PROT_WRITE) != 0)
 600     {
 601       __munmap (p2, HEAP_MAX_SIZE);
 602       return 0;
 603     }
 604   h = (heap_info *) p2;
 605   h->size = size;
 606   h->mprotect_size = size;
 607   LIBC_PROBE (memory_heap_new, 2, h, h->size);
 608   return h;

Она также видитнекоторые действия в других частях кода glibc, например:

> grep * -Rnie heap_info
ChangeLog.16:1043:  * malloc/arena.c (heap_info): Adjust the padding size if
ChangeLog.17:11564: * malloc/arena.c (heap_info): Add mprotect_size field, adjust pad.
Binary file malloc/.arena.c.swo matches
malloc/malloc.c:2403:      heap_info *old_heap, *heap;
malloc/malloc.c:3225:     heap_info *heap = heap_for_ptr (oldtop);
malloc/malloc.c:4087:   heap_info *heap = heap_for_ptr(top(av));
malloc/malloc.c:5177:     heap_info *heap = heap_for_ptr (top (ar_ptr));
Binary file malloc/.arena.c.swn matches
malloc/arena.c:48:typedef struct _heap_info
malloc/arena.c:51:  struct _heap_info *prev; /* Previous heap. */
malloc/arena.c:56:     that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of
malloc/arena.c:59:} heap_info;
malloc/arena.c:61:/* Get a compile-time error if the heap_info padding is not correct
malloc/arena.c:63:extern int sanity_check_heap_info_alignment[(sizeof (heap_info)
malloc/arena.c:126:  ((heap_info *) ((unsigned long) (ptr) & ~(HEAP_MAX_SIZE - 1)))
malloc/arena.c:493:dump_heap (heap_info *heap)
malloc/arena.c:535:static heap_info *
malloc/arena.c:542:  heap_info *h;
malloc/arena.c:604:  h = (heap_info *) p2;
malloc/arena.c:615:grow_heap (heap_info *h, long diff)
malloc/arena.c:643:shrink_heap (heap_info *h, long diff)
malloc/arena.c:681:heap_trim (heap_info *heap, size_t pad)
malloc/arena.c:686:  heap_info *prev_heap;
malloc/arena.c:776:  heap_info *h;

Я также знаю, что макросы heap_for_ptr (ptr) и top (ar_ptr) используются для поиска этого в коде следующим образом:

42 #define top(ar_ptr) ((ar_ptr)->top)
...
 123 /* find the heap and corresponding arena for a given ptr */
 124 
 125 #define heap_for_ptr(ptr) \
 126   ((heap_info *) ((unsigned long) (ptr) & ~(HEAP_MAX_SIZE - 1)))
 127 #define arena_for_chunk(ptr) \
 128   (chunk_non_main_arena (ptr) ? heap_for_ptr (ptr)->ar_ptr : &main_arena)
 129 
 130 

Но у меня возникают проблемы с поиском этой фактической структуры в памяти во время выполнения.Кто-нибудь знает, как найти структуры heap_info в памяти?Желательно использовать открытый исходный код и широко доступные инструменты, такие как (GDB).

Цените помощь!

...