[SW정글][Malloc Lab] brk / sbrk

JST·2023년 9월 8일
0

C

목록 보기
2/6

brk 시스템 콜은 대표적으로 malloc 함수로 메모리 할당을 요청할 때 사용되는 시스템 콜로 볼 수 있다.
malloc에서는 실제 메로리를 할당받기 위해서 brk 또는 mmap 시스템 콜을 사용하게 된다.

brk / sbrk 의 정의

#include <unistd.h>

int brk(void *addr);
void* sbrk(intptr_t increment);

brk, sbrk 는 힙의 크기를 변경한다.
힙은 Uninitialized된 데이터 영역 직후에 시작해서 위쪽으로 메모리 주소가 커지는 영역이다.
brk, sbrk는 현재 프로세스의 program break(힙의 꼭대기를 가리키는 변수)의 위치를 변경하는 함수이다.
(heap 영역의 요청이 없을 때 까지는 Data Segment = Program Break이다.)

brk와 sbrk 함수를 사용하여 힙의 크기를 조정 할 수 있다.

  • program break를 증가시켜 메모리 할당 효과.
  • program break를 감소시켜 메모리 할당해제 효과.

brk / sbrk 차이

  • brk

    brk() 는 해당 값이 합리적이고, 시스템에 메모리가 충분할 때 program break를 brk의 인자인 addr에서 지정한 값으로 설정한다.
    그리고 프로세스는 최대 데이터 크기를 초과하지 않는다.

  • sbrk

    sbrk() 는 program break를 increment bytes만큼 증가시킨다. increment 인자를 0으로 설정하여 sbrk()를 호출하는 것은 현재 program break의 위치를 찾을 때 쓰인다.

두 함수의 차이점은 program break를 설정하는가증가시키냐의 차이다.
또한 sbrk()함수에 increment의 인자를 0으로 설정한 후 호출하게되면 현재 program break의 위치를 void* 형 포인터로 반환함을 알 수 있다.

리턴값

  • brk

    • 성공시 0 반환
    • 실패시 -1 반환
    • errno는 ENOMEM으로 설정
  • sbrk

    • 성공시 이전 program break 값을 반환.
      ( program break가 증가한 경우, 이 반환 값은 새로 할당된 메모리의 시작부분에 대한 포인터이다. )
    • 실패시 void* 포인터 형으로 -1 반환
    • errno는 ENOMEM으로 설정

brk와 ASLR(링크)

1개의 댓글

comment-user-thumbnail
2023년 9월 9일

글을 잘쓰시네용 잘보고갑니다

답글 달기