상세 컨텐츠

본문 제목

(Heap 구조) Chunk 구조

Hacking/메모

by whave 2021. 4. 10. 19:16

본문

<스택과 힙 차이 비교>

스택
높은 주소 -> 낮은 주소 낮은 주소 -> 높은 주소
지역 변수 전역 변수
컴파일 시 할당 런타임 시 할당
자동으로 할당&해제 사용자가 직접 할당&해제

<malloc()으로 할당했을 경우 chunk 구조>

prev_size [4bytes]
size[4bytes] flag(A/M/P)
data

 

*prev_size: (prev:이전, 앞선)이전 chunk의 크기

*size: 현재 chunk의 크기

*flag

        -A(non_main_arena): thread마다 다른 heap영역을 사용하는 경우 현재chunk가 main heap(arena)에 속하는지 여                                     부를 나타낸다.

        -M(is_mmaped): chunk자체가 단일 mmap()시스템 콜을 통해 할당되었을 때 셋팅 된다.

        -P(prev_in_use): 이전 chunk의 상태를 나타낸다. (이전chunk가 사용중이면 1, 아니면 0)

*data: 실제 데이터가 들어가는 영역과 힙 차이 비교>

 

스택 힙

높은 주소 -> 낮은 주소 낮은 주소 -> 높은 주소

지역 변수 전역 변수

컴파일 시 할당 런타임 시 할당

자동으로 할당&해제 사용자가 직접 할당&해제

<malloc()으로 할당했을 경우 chunk 구조>

 

prev_size [4bytes]

size[4bytes] flag(A/M/P)

data

 

 

*prev_size: (prev:이전)이전 chunk의 크기

 

*size: 현재 chunk의 크기

 

*flag

 

        -A(non_main_arena): thread마다 다른 heap영역을 사용하는 경우 현재chunk가 main heap(arena)에 속하는지 여 부를 나타낸다.

 

        -M(is_mmaped): chunk자체가 단일 mmap()시스템 콜을 통해 할당되었을 때 셋팅 된다.

 

        -P(prev_in_use): 이전 chunk의 상태를 나타낸다. (이전chunk가 사용중이면 1, 아니면 0)

 

*data: 실제 데이터가 들어가는 영역

 

<gdb로 malloc후 메모리 상태 변화 확인>

gcc -o heap heap.c
첫번째 malloc 이후 heap영역 메모리
두번째 malloc이후 heap영역 메모리

 

위 과정을 통해 heap은 높은 주소로 자란다는 것을 알 수 있다. 그리고 top chunk에서 사용자가 요청한 크기만큼 변하는 것을 알 수 있다.

!!!! top chunk가 할당하고 있던 영역에서 사용자가 요청한 크기만큼 주고난 후 그 크기만큼 주소가 증가함을 확인할 수 있다.

 

<top chunk>

top chunk란 arena(malloc이 관리하는 영역, heap)의 가장 꼭대기에 있는 chunk.

어떤 bin에도 속하지 않는다.

 

top chunk는 bin에 해제된 chunk가 없는 경우 사용자의 요청에 응답하기 위해 사용된다.

 

!!집중!! 사용자가 요청한 크기가 top chunk보다 작은 경우 2가지로 분리된다. 

       1. User Chunk(사용자가 요청한 크기)

       2. Remainder Chunk(새로운 top chunk)

사용자가 요천한 크기가 top chunk보다 큰 경우 sbrk(main arena)또는 mmap(thread arena)syscall을 사용해 top chunk를 확장시킨다.

 

<free()로 해제한 경우 chunk구조>

prev_size(4bytes)
size(4bytes) flag(A/M/P)
fd(bytes)
bk(4bytes)

*fd(forward pointer): free된 다음 청크 (forword 미래)

*bk(backward pointer): free된 이전 청크 (backword 과거)

 

fd,bk와 같은 포인터들은 단일 연결 리스트 or 이중 연결 리스트 형태로 이어져있다.

bin에서 free된 chunk가 관리된다.

 

 

실제 chunk영역은 다음 chunk의 prev_size까지였다는 사실

사실은 다음 chunk의 prev_size필드도 현재 chunk의ㅣ 데이터 영역으로 사용한다는 충격 사실...

 

<bin>

bin구조
믈리적으로 붙어있는 것이 아님을 주의!!

다음 그림과 같이 free된 chunk는 bin이 이중 연결 리스트로 관리한다.

(fastbins은 단일 연결리스트로 관리한다.)

사진출처: wogh8732.tistory.com/179

 

 

 


참고:

d41jung0d.tistory.com/108

wogh8732.tistory.com/179

'Hacking > 메모' 카테고리의 다른 글

fopen함수 분석  (0) 2022.06.15
Docker error: standard_init_linux.go:228: exec user process caused: no such file or directory  (0) 2021.08.10
도커 설치  (0) 2021.08.09
(Heap 구조) bin구조  (0) 2021.04.11

관련글 더보기