솔직히 sbrk가 정확히 뭘 하는 놈인지 모르겠습니다.
Memory에서 Heap 영역과 관련이 있다는 것 정도 ㅋㅋㅋ
general_init()에 보면, xmalloc_set_program_name()입니다.
void
xmalloc_set_program_name (const char *s)
{
name = s;
#ifdef HAVE_SBRK
/* Win32 ports other than cygwin32 don't have brk() */
if (first_break == NULL)
first_break = (char *) sbrk (0);
#endif /* HAVE_SBRK */
}
여기서 sbrk() ... 도대체 뭘까요 ?
1 380 boehm-gc/os_dep.c <<sbrk>>
#define sbrk tiny_sbrk
2 944 /usr/include/unistd.h <<sbrk>>
extern void *sbrk (intptr_t __delta) __THROW;
우선 sbrk는 인자값이 있으므로 1이 아니라고 하고, 2번을 가봤습니다.
/* Increase or decrease the end of accessible data space by DELTA bytes.
If successful, returns the address the previous end of data space
(i.e. the beginning of the new space, if DELTA > 0);
returns (void *) -1 for errors (with errno set). */
extern void *sbrk (intptr_t __delta) __THROW;
man sbrk를 해봤습니다.
BRK(2) 리눅스 프로그래머 매뉴얼 BRK(2)
이름
brk, sbrk - 데이터 세그먼트 크기를 변경한다.
사용법
#include <unistd.h>
int brk(void *end_data_segment);
void *sbrk(ptrdiff_t increment);
설명
brk 은데이터 세그먼트의 끝을 end_data_segment으로지정된 값으로 설정한다.
end_datasegment는텍스트 세그먼트의 끝보다 커야 하며 스택의 끝보다 16kB 앞에 있어야 한다.
sbrk는 increment 바이트만큼 프로그램의 데이터 공간을 증가시킨다.
sbrk는시스템 콜이 아니며, 단지 C 라 이 브 러 리 레퍼(wrapper) 함수이다.
반환값
성 공 시, brk 는 0을 리턴하며, sbrk는새로운 영역의 시작을 가리키는 포인터를 리턴한다.
에러시, -1이 리턴되며, errno는 ENOMEM 으로 설정된다.
호환
BSD 4.3 brk와 sbrk는 C 표준에 정의되어 있지 않으며 POSIX.1 표준에서도 제외되었다.
(paragraphs B.1.1.1.3과 B.8.3.3 참조하라)
관련 항목
execve(2), getrlimit(2), malloc(3)
여기서 데이터 세그먼트의 크기라는 것의 개념이 좀 안잡히네요 ㅡ_ㅡ;;;
누가 좀 구체적으로 설명해주실 수 있나요 ?
여기서 segment의 개념이 좀 와닿지 않네요 ...
Binary File의 Section에 대한 소리인가요 ?
object.o와 link.o 라는 2개의 object 파일이 있을때,
end_data_segment라 함은 각 object 파일에서 .data Section의 끝 부분을 의미하는건지요 ?
근대 생각을 해보면, brk 관련된 녀석들은 Memory 영역중 Heap과 관련되어있는데,
위의 부분이 무슨 뜻을 의미하는지 와닿지가 않습니다.