[질문]malloc 할때마다 호출되는 커널내 함수에 대한 질문
글쓴이: juluv / 작성시간: 목, 2005/02/10 - 7:28오후
먼저 새해 복 많이 받으세요...
다름이 아니라 "프로세스가 메모리 할당을 요청할 때 커널의 어떤 부분이 이를 담당"하는지 궁금해서 질문을 드리게 되었습니다.
좀 더 구체적으로 말씀드리면,
------------- test.c --------------- #include <stdlib.h> int main(void){ int *a=calloc(4,(sizeof)int); free(a); return 0; } -------------------------------------
위의 유저프로그램에서 calloc을 할 때,
커널 내의 sys_brk(mm/mmap.c)가 호출되어 heap영역을 할당해준다고 알고있습니다.
하지만 sys_brk내에 다음과 같이
printk("hi");
hi라고 찍도록 표시를 해놓아도 정작 malloc이 일어나는 부분에서는 hi가 찍히지 않습니다.
질문은...
1. calloc으로 호출되는 커널 함수가 sys_brk가 아닌것인지.
2. sys_brk가 맞다면 왜 위와 같은 현상이 일어나는 것인지.
입니다.
고수님들의 아낌없는 조언 부탁드립니다. 긴 글 읽어주셔서 감사합니다.
Forums:
malloc(), calloc(), free() 함수는 C library
malloc(), calloc(), free() 함수는 C library에 있는 메모리 관리 함수입니다. C library의 메모리 관리자는 brk() 시스템 콜을 이용하여 heap이라는 영역을 할당받은 후 이 영역을 자신이 직접 관리합니다. 그 영역 안에서 malloc() 같은 메모리 할당 요구를 처리합니다. 처음에 어느정도 크기를 미리 heap 용도로 받아두었다가 나중에 메모리가 더 필요하게 되는 경우에만 brk()를 호출하여 heap 영역을 키우게 됩니다. brk()는 heap 영역을 줄이는 용도로도 사용할 수 있지만 보통의 C library는 일단 할당받은 heap 영역을 줄이지 않습니다. malloc() 함수가 불렸다고 바로 brk() 시스템 콜이 불리는 것은 아닙니다.
Freedom is another word for nothing left to lose,
Nothing doesn't mean nothing if it ain't free.
답변에 감사드리며, 추가질문 드립니다.
답변에 감사드립니다.
정리하자면
그렇다면, 제가 제시한 방법 말고, 메모리 할당이 일어나는 것을 즉각 알아낼 수 있는 다른 방법이 있을까요?
이건 어떤가요..
http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html
훅함수들을 이용하는건요?
커널내부에서 할당되는걸 말하는거라면 상관없겠군요..
힘내세요.
훅함수도 좋지만... -.-;;
답변 감사드립니다.
그런데 훅함수를 이용하려면 소스를 수정해야만 가능하군요..
저는 원본 소스를 수정하지 않고, 커널 차원에서 malloc이 일어나는 것을 알아낼 수 있는 방법을 찾고자 하는데요..
혹시나 그런 방법이 있을까요?
답변 해주셔서 거듭 감사드립니다.
brk 시스템콜은 단지 프로세스의 데이터 세그먼트의 영역을 넓혀주는 일만
brk 시스템콜은 단지 프로세스의 데이터 세그먼트의 영역을 넓혀주는 일만 하는 것입니다. malloc 은 C-library에 있는 것이며, 데이터 세그먼트의 남는 영역을 잘 활용하여 heap용도로 사용하는 것일 뿐이고, 모자랄 경우 데이터 세그먼트를 늘여달라고 커널에 요청하는 것 뿐입니다.
즉, 커널 모드에서는 데이터 세그먼트의 증가를 요청 받을 뿐이지, 그 늘어난 양이 반드시 새로운 메모리 할당을 위해 사용되리라는 보장이 없습니다.
커널에서 malloc을 찾는 것이 혹시 디버깅을 하려는 것에서라면,
LD_PRELOAD를 통해서 malloc 함수가 들어 있는 shared object를 c library보다 먼저 읽게 하여 malloc 함수를 override 하는 것이 좋습니다.
---
http://coolengineer.com
정말 감사드립니다.
답변 정말 감사드립니다.
LD_PRELOAD로 한 번 시도를 해보도록 하겠습니다.
good..
좋은 방법이시군요 :)
힘내세요.
댓글 달기