보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
이 포스트에서는 malloc()함수가 호출되는 과정을 분석해보겠다. 사실상 malloc.c에서 가장 핵심적인 부분이다. __libc_malloc() 함수 호출. [ Thread Arena ] mstate ar_ptr 변수에 arena_get(ar_ptr, bytes)를 이용해 Arena 정보를 저장한다. victim = _int_malloc(ar_ptr, bytes); 을 통해 victim에 할당받은 chunk정보 저장. [ Main Arena ] victim = _int_malloc(&main_arena, bytes); 를 통해 victim에 할당받은 chunk정보 저장. assert( !victim | &main_arena == areana_for_chunk(mem2chunk(victim))); 이후..
unlink_chunk()함수에서는 우선 요청된 Chunk p와, p->prev->next와 같은 사이즈인지 비교한다. 두번째로, if ( FD->bk != p || BK->fd != p ) 기존에 없었던, 이부분을 검사한다. 이 부분을 우회하는 기법이 unsafe unlink이다. 위에 두 조건을 통과하면, FD->bk = BK, BK->fd = FD 를 통해 unlink 하고, large bin의 경우 fd_nextsize와 bk_nextsizxe를 unlink해준다. 나머지 bin의 경우는 그대로 종료한다.
이 포스트에서는 malloc.c에서 사용되어지는 대표적인 구조체들을 알아보고, malloc(), free()함수에서 사용되는, 여러가지 정보를 포스팅할 것이다. malloc_state 구조체 주요 항목들 fastbinsY[NFASTBINS] → 해당 Arena에서 fastbin의 시작 포인터들로 이루어진 배열. 배열의 각 인덱스가 byte별 fastbin의 시작 포인터가 된다. top → Top Chunk의 주소가 들어있는 포인터 변수. last_remainder → bin에 들어있는 chunk를 분할하여 할당해주고 남은 chunk의 주소가 들어있는 포인터 변수. bins[NBINS * 2 - 2] → unsorted bin, small bin, large bin의 시작 포인터로 이루어진 배열. 0~63..