Internal functions
내부적으로 사용되는 보편적인 함수에 대해 알아보자.
몇몇의 함수는 #define 지시문을 사용하여 정의해 놨기 때문에 호출된 파라미터는 함수종료 후에도 변경사항은 유지된다.
물론, MALLOC_DEBUG가 설정되지 않는 것으로 가정합니다.
arena_get (ar_ptr, size)
아레나를 획득하고 해당 뮤택스를 lock합니다. ar_ptr은 해당 아레나를 가르키는 포인터이고, size는 얼만큼의 메모리크기를 필요로 하는지를 나타낸다.
sysmalloc [TODO]
sysmalloc은 시스템에서 더 많은 메모리를 필요로 하는 malloc케이스를 처리한다. 입력시, av -> top에는 nb바이트에 대한 서비스 요청에 충분한 공간이 없으므로 av->top을 확장하거나 대체한다.
void alloc_perturb (char * p, size_t n)
perturb_byte (M_PERTURB를 사용하는 malloc의 변경가능한 매개 변수)가 0이 아닌 경우 (기본적으로 0), p가 가리키는 n 바이트를 perturb_byte ^ 0xff와 같게 설정합니다.
void free_perturb (char * p, size_t n)
perturb_byte (M_PERTURB를 사용하는 malloc의 변경가능 파라미터)가 0이 아닌 경우 (기본적으로 0), p가 가리키는 n 바이트를 perturb_byte와 동일하게 설정합니다.
void malloc_init_state (mstate av)
malloc_state 구조체를 초기화
이것은 malloc_consolidate 내에서만 호출되며, 어쨌든 동일한 컨텍스트에서 호출되어야합니다. 일부 최적화 컴파일러가 모든 호출 지점에서 인라인하려고 시도하기 때문에 malloc_consolidate 외부에서 직접 호출되지 않습니다. 이는 최적화가 아닐 수도 있습니다. (malloc_consolidate을 통해 인라이닝하는 것은 fine.)
fastbin이 아닌경우, 각 bin에 대해서 빈 순환 링크트리스트를 만든다.
av에 FASTCHUNKS_BIT 플래그를 설정한다.
av -> top을 첫 번째 unsorted chunk 로 초기화 한다.
unlink(AV, P, BK, FD)
bin에서 chunk를 제거하기 위해 정의된 매크로
제거하려는 청크의 크기가 다음 청크에 설정된 이전 청크의 사이즈와 일치하는지 확인한다. prev_size
그렇지 않으면 오류가 발생한다.
제거를 용이하게 하기위해 인접한 청크들의 포인터를 잘 조정한다.
P -> fd -> bk = P -> bk
P -> bk -> fd = p -> fd
void malloc_consolidate(mstate av)
free()의 특수화 된 버전
1. global_max_fast가 0 (초기화되지 않음)인지 확인한다. 값이 0이면 매개 변수로 av를 사용하여 malloc_init_state를 호출하고 리턴
Fast bin이 처리하는 메모리의 최대 크기는 global_max_fast에 의해 결정된다.
2. global_max_fast가 0이 아니면 av에 대해 FASTCHUNKS_BIT를 지웁니다.
3. 첫 번째 인덱스에서 마지막 인덱스까지 fastbin 배열을 반복합니다.
1) 현재 fastbin 청크에 잠금을 설정하고 null이 아닌 경우 계속 진행한다.
2) 이전 청크가 사용 중이 아니면 이전 청크에서 unlink를 호출한다.
3) 다음 청크가 TOP chunk가 아닌 경우 :
1>다음 청크가 사용 중이 아니면 다음 청크에서 unlink를 호출한다.
2>청크를 이전과 병합한 다음 통합 된 청크를 unsorted bin의 헤드에 추가한다.
4. next chunk가 TOP chunk인 경우, 청크를 하나의 TOP 청크로 적절하게 병합한다.
NOTE : 'in use'에 대한 점검은 PREV_IN_USE 플래그를 사용하여 수행된다. 따라서 다른 fastbin 청크의 free는 확인되지 않는다.
'Heap' 카테고리의 다른 글
07.Security Checks (1) | 2018.06.05 |
---|---|
06.malloc 분석 (0) | 2018.06.05 |
04.Bins and Chunks (0) | 2018.05.24 |
03.malloc_state (0) | 2018.05.24 |
02.malloc_chunk (0) | 2018.05.24 |