Clone() 을 이용하여 Process 를 생성할 때 stack 을 인자로 넘겨야 하는 이유가 무엇일까요?

oldy9498의 이미지

안녕하세요?

최근에 Kernel 공부를 시작했습니다.

Process 를 생성하기 위한 함수들을 분석하다가 Clone 과 Fork 가 system call 을 통해 do_fork() 를 호출한다는 것을 알았습니다.

그런데, Clone() 함수를 아래와 같이 사용하면 Thread 보다는 Process 가 생성되는 것으로 알고 있습니다.

clone(sub_func_a, (void*)(child_b_stack+4905), CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID, NULL);

그렇다면, do_fork() 내의 copy_process() 를 수행하면서 child process 의 task_struct 를 생성하고,
그 과정에서 kernel stack 을 생성할텐데 왜 Stack 을 인자로 넘겨줘야지만 제대로 동작할까요?

예를 들어서

clone(sub_func_a, 0, CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID, NULL);

요렇게 사용할 경우, ARM system 에서는 fork() 와 clone() 의 system call 함수가 clone_flag 를 제외한 주요 인자가 동일하게 do_fork 로 전달됩니다.

(parent_tidptr, child_tidptr 가 sys_clone 에서 do_fork 로 전달되지만 stack 과 관련해서는 별 영향이 없는 것으로 보입니다.)

그럼에도 불구하고 두 함수 사이에 동작 차이가 발생하는 건 왜 그럴까요?

도대체 clone 에 넘겨주는 stack 의 용도는 무엇인지 알려주세요.

고수님들의 하해와 같은 아량 부탁드립니다.

pastime의 이미지

fork 시스템 콜을 이용하면 (내용은 모두 같을지라도) 별도의 메모리 영역을 가지는 프로세스를 생성하지만
clone 시스템 콜을 이용하면 메모리 영역을 공유하는 스레드/프로세스를 만들수 있습니다. (CLONE_VM)

이와 같은 경우 생성된 스레드/프로세스에서 사용할 사용자 공간 스택을 미리 할당하고
그 시작 주소를 넘겨주는 역할을 하는 것입니다. (즉, 커널 스택과는 관련이 없습니다.)
CLONE_VM 플래그를 지정하지 않았다면 0 값을 넘겨주어
부모 프로세스와 동일한 스택 주소를 사용하도록 해야 할 것입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.