[질문]malloc 할때마다 호출되는 커널내 함수에 대한 질문

juluv의 이미지

먼저 새해 복 많이 받으세요...
다름이 아니라 "프로세스가 메모리 할당을 요청할 때 커널의 어떤 부분이 이를 담당"하는지 궁금해서 질문을 드리게 되었습니다.

좀 더 구체적으로 말씀드리면,

------------- 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가 맞다면 왜 위와 같은 현상이 일어나는 것인지.
입니다.

고수님들의 아낌없는 조언 부탁드립니다. 긴 글 읽어주셔서 감사합니다.

flyduck의 이미지

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.

juluv의 이미지

답변에 감사드립니다.

정리하자면

Quote:
C library 메모리 관리자가 처음에 어느정도 크기를 미리 heap 용도로 받아두기 때문에, malloc() 함수가 불렸다고 바로 brk() 시스템 콜이 불리는 것은 아니다
라는 말씀이시네요.

그렇다면, 제가 제시한 방법 말고, 메모리 할당이 일어나는 것을 즉각 알아낼 수 있는 다른 방법이 있을까요?

jyj9782의 이미지

http://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html

훅함수들을 이용하는건요?

커널내부에서 할당되는걸 말하는거라면 상관없겠군요..

힘내세요.

juluv의 이미지

답변 감사드립니다.

그런데 훅함수를 이용하려면 소스를 수정해야만 가능하군요..
저는 원본 소스를 수정하지 않고, 커널 차원에서 malloc이 일어나는 것을 알아낼 수 있는 방법을 찾고자 하는데요..
혹시나 그런 방법이 있을까요?

답변 해주셔서 거듭 감사드립니다.

pynoos의 이미지

brk 시스템콜은 단지 프로세스의 데이터 세그먼트의 영역을 넓혀주는 일만 하는 것입니다. malloc 은 C-library에 있는 것이며, 데이터 세그먼트의 남는 영역을 잘 활용하여 heap용도로 사용하는 것일 뿐이고, 모자랄 경우 데이터 세그먼트를 늘여달라고 커널에 요청하는 것 뿐입니다.

즉, 커널 모드에서는 데이터 세그먼트의 증가를 요청 받을 뿐이지, 그 늘어난 양이 반드시 새로운 메모리 할당을 위해 사용되리라는 보장이 없습니다.

커널에서 malloc을 찾는 것이 혹시 디버깅을 하려는 것에서라면,
LD_PRELOAD를 통해서 malloc 함수가 들어 있는 shared object를 c library보다 먼저 읽게 하여 malloc 함수를 override 하는 것이 좋습니다.

juluv의 이미지

답변 정말 감사드립니다.
LD_PRELOAD로 한 번 시도를 해보도록 하겠습니다.

jyj9782의 이미지

좋은 방법이시군요 :)

pynoos wrote:
brk 시스템콜은 단지 프로세스의 데이터 세그먼트의 영역을 넓혀주는 일만 하는 것입니다. malloc 은 C-library에 있는 것이며, 데이터 세그먼트의 남는 영역을 잘 활용하여 heap용도로 사용하는 것일 뿐이고, 모자랄 경우 데이터 세그먼트를 늘여달라고 커널에 요청하는 것 뿐입니다.

즉, 커널 모드에서는 데이터 세그먼트의 증가를 요청 받을 뿐이지, 그 늘어난 양이 반드시 새로운 메모리 할당을 위해 사용되리라는 보장이 없습니다.

커널에서 malloc을 찾는 것이 혹시 디버깅을 하려는 것에서라면,
LD_PRELOAD를 통해서 malloc 함수가 들어 있는 shared object를 c library보다 먼저 읽게 하여 malloc 함수를 override 하는 것이 좋습니다.

힘내세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.