커널 thread 소스 분석(어셈블리 ㅠㅠ)..

bosub의 이미지

int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
long retval, d0;

__asm__ __volatile__(

"movl %%esp,%%esi\n\t" /* 이 부분은 무엇을 하는 건가염? */

"int $0x80\n\t" /* clone() 호출인데 eax에 아무것도 안 넣는데? */

"cmpl %%esp,%%esi\n\t"
"je 1f\n\t" /*이건 1(float) "1:\t" 뛰는거져 */

"movl %4,%%eax\n\t"

"pushl %%eax\n\t" /* 함수 호출시 파라미터 넣기 */

"call *%5\n\t"

"movl %3,%0\n\t"

"int $0x80\n"

"1:\t"

/* 출력 */ :"=&a" (retval) /* %0 */ , "=&S" (d0) /* %1 */
/* 입력 */ :"0" (__NR_clone) /* %2 */ , "i" (__NR_exit) /* %3 */,
"r" (arg) /* %4 */, "r" (fn) /* %5 */,
"b" (flags | CLONE_VM) /* %6 */
/*변경된레지스터*/ : "memory");

return retval;
}

이 커널 소스가

int kernel_thread(int (*fn)(void*), void *arg, unsigned long flags)
{
pid_t p;
p = clone(0,flags | CLONE_VM);
if (p)
return p;
else {
fn(arg);
exit();
}
}

이 역할을 한다구 하는데 인라인 어셈블리땜시 이해가 잘 안되네염 ㅠㅠ
어느 정도는 이해를 했는데 자세하게는 잘 모르겠어요

위 어셈블리 코드 분석좀 부탁드립니다.

gurugio의 이미지

다는 모르겠구요 제가 아는대로라도 말씀드리면요

__asm__ __volatile__(
"movl %%esp,%%esi\n\t"
-> 스택에는 d0이 들어있습니다.
그래서 먼저 d0을 esi 레지스터에 저장했다가
아래 인터럽트 호출 후에 스택에 있는 d0값이 변했나 확인해서 (je 1f부분)
변하지 않았으면 바로 종료합니다.
변했으면 je 다음 줄부터 실행합니다.

"int $0x80\n\t"
-> 80번 인터럽트를 호출합니다. 여기서 eax에 들어있는 값이 따라
다른 시스템 콜이 호출돼는 콜 게이트라는 거라고 들었습니다.
아마 clone을 호출하는 것 같습니다.

"cmpl %%esp,%%esi\n\t"
"je 1f\n\t"

"movl %4,%%eax\n\t"
"pushl %%eax\n\t"
"call *%5\n\t"
-> 여기서 %5는 fn을 가리킵니다. 그리고 바로 윗줄의 %4는
arg를 가르킵니다. 그래서 콜링 컨벤션에 따라
arg를 스택에 넣고 fn을 호출합니다.

"movl %3,%0\n\t"
"int $0x80\n"
-> retval에 NR_exit 값을 넣어서 콜 게이트를 호출합니다.
왜 어떤 시스템 콜을 호출하는 지는 모르겠습니다.

"1\t"
"=&a" (retval), "=&S" (d0)
"0" (__NR_clone), "i" (__NR_exit),
"r" (arg), "r" (fn),
"b" (flags | CLONE_VM)
"memory");

인라인 어셈블리에 대해서는 알겠는데
커널이 어떻게 동작하는 지를 잘 모르겠네요.
도움이 잘 안됄것 같네요..쩝. oops

방준영의 이미지

	else {
	   fn(arg);
	   exit();
	}

여기서 exit()는 _exit()가 되어야 맞습니다. 스레드를 하나만 종료했는데 exit()를 호출하면 다른 스레드들까지 전부 죽어 버리는 현상이 발생하니까요.

그리고 int $0x80와 같은 명령은 인터럽트 게이트라고 합니다. 콜 게이트는 call 명령을 쓰는 것을 말합니다.

댓글 달기

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