리눅스에서 malloc동작원리가 궁금합니다.

milkrookie의 이미지

제가 malloc함수를 구현을 했는데요. brk와 sbrk를 이용해서 구현을 했습니다.
메인함수가 시작되면 brk와 sbrk로 특정 메모리 영역을 할당을 해버리고 그 메모리 안에서만 malloc을 사용하는데요.
제가 작성한 malloc함수로 프로그램을 짜서 실행을 시키면 작동이 잘됩니다.
그런데 메모리 할당된 모습을 보려고 제가 작성한 프로그램을 pin tool을 이용해서 돌리니 메모리를 할당할 수 없다고 에러메세지가 발생해버리네요...(에러메세지는 sbrk를 이용해서 할당이 실패해 반환값이 -1이 나오면 출력하도록 제가 만든 메세지입니다.)

메모리를 처음에 할당하는 방법은 sbrk(Memory_size)를 이용해서 할당을 했습니다.(Memory size는 1.7G정도로 잡은 상태입니다. OS는 우분투 12.04 64bit버전이고요.)
그냥 기본 malloc을 이용해서 작성하면 pin tool에서 잘 돌아가는데 제가 만든 malloc을 이용하면 왜 안돌아가는지 그 이유를 모르겠습니다.
혹시 조언좀 해주실수있나요??

bushi의 이미지

glibc malloc() 이라면 소스 보시면 동작원리 정도는 껌이고요.

brk 가 있는 아키텍쳐라도 항상 brk 만 사용하는 것은 아니고,
malloc 할 때마다 매번 brk 나 mmap(MAP_ANONYMOUS) 가 호출되는 것도 아닙니다.
아무튼... 소스 보셔야 아래 내용이 이해가 가실겁니다.

[bushi@rose kernel]$ cat m.c
#include <stdlib.h>
int main(int argc, char **argv)
{
	void *mem1 = malloc(atoi(argv[1]));
	void *mem2 = malloc(atoi(argv[1]));
	return mem1 == NULL || mem2 == NULL;
}
[bushi@rose kernel]$ 
[bushi@rose kernel]$ 
[bushi@rose kernel]$ gcc -o m m.c -Wall -O0 -g
[bushi@rose kernel]$
[bushi@rose kernel]$ 
[bushi@rose kernel]$ 
[bushi@rose kernel]$ ltrace -S ./m 128
...
...
__libc_start_main(0x80483f4, 2, 0xbffea9c4, 0x8048470, 0x8048460 <unfinished ...>
atoi(0xbffeb504, 0, 0x285cc0, 0x284ff4, 0x8048470) = 128
malloc(128 <unfinished ...>
SYS_brk(NULL)                                    = 0x8ef7000
SYS_brk(0x8f18000)                               = 0x8f18000
<... malloc resumed> )                           = 0x8ef7008
atoi(0xbffeb504, 0, 0x285cc0, 0x284ff4, 0x8048470) = 128
malloc(128)                                      = 0x8ef7090
SYS_exit_group(0 <no return ...>
+++ exited (status 0) +++
[bushi@rose kernel]$ 
[bushi@rose kernel]$ 
[bushi@rose kernel]$ 
[bushi@rose kernel]$ ltrace -S ./m 1000000
...
...
__libc_start_main(0x80483f4, 2, 0xbfadda54, 0x8048470, 0x8048460 <unfinished ...>
atoi(0xbfadf500, 0, 0xc7acc0, 0xc79ff4, 0x8048470) = 0xf4240
malloc(1000000 <unfinished ...>
SYS_mmap2(0, 0xf5000, 3, 34, -1)                 = 0xb77a2000
<... malloc resumed> )                           = 0xb77a2008
atoi(0xbfadf500, 0, 0xc7acc0, 0xc79ff4, 0x8048470) = 0xf4240
malloc(1000000 <unfinished ...>
SYS_mmap2(0, 0xf5000, 3, 34, -1)                 = 0xb76ad000
<... malloc resumed> )                           = 0xb76ad008
SYS_exit_group(0 <no return ...>
+++ exited (status 0) +++
[bushi@rose kernel]$