Kernel_thread로 실행하는 함수에서 return하면 어떻게 되는지요

redhairs의 이미지

uclinux소스를 참조하여 리눅스를 openrisk라는 target에포팅하고 있습니다.

커널에 대해서 잘 모르면서 하자니 무척 힘이 드네요....^^

커널 쓰레들 실행할 때 보통
kernel_thread(xxx,NULL,FLAG);
.....

static int xxx(void)
{
.....
while(1){

...........
schedule();
}
}
이런식으로 쓰면서 6개 정도의 커널 쓰레드를 생성해서 쓰고 있는데....
while바로 앞에 특정 조건을 충족하지 못하면 return하도록 예컨데
static int xxx(void)
{
.....
if(y !=0 ) return;
while(1){
...........
schedule();
}
}
이렇게 하면 스케줄러(?)가 제대로 동작하지 않는 것 같습니다.
사실 제가 만든 코드가 아니라서 저런식으로 return시키는 이유를 잘 모르겠구요...쓰레드를 그냥 없애버리려고 그러는 것 같기도 하고...-_-

아무튼 커널쓰레드에서 저런식으로 리턴시키는 이유와 그 결과를 알고 싶고..
그렇게 하는 것이 올바른 방법인지....아니라면 다른 방법이 있는지도 알고 싶습니다.
올바른 방법이라면 return에 아무런 값을 안주고 그냥 쓰레기 값을 리턴해도
상관없는 것인지도 알려주시면 감사하겠습니다.

sunyzero의 이미지

thread는 자신의 작업을 종료할때 리턴을 하게됩니다.

보통 detach된 경우는 그냥 없어지고 ,아닌 경우는 리턴값을 특정주소에 보관했줍니다.

제대로 소스를 파악하시고 계신것 같네요. ^^*

========================================
* The truth will set you free.

redhairs의 이미지

네.....음....

정상적인 경우라면 return을 하건...

return을 하지 않고 무한 루프를 돌건 별 상관이 없을거라 여겨지는데....

제 지금 증상은 비정상적인 상황인것 같아서...질문을 드린겁니다....

즉 return하지 않고 무한루프만을 계속 도는 경우에는 (쓰레드가 소멸되지

않는 경우) 문제없이 부팅이 되는데...( = 스케줄러가 정상동작하여 나머지 커널

쓰레드들이 스케줄링 됨 )

return을 하게 되면(쓰레드가 소멸되면 ) 다른 커널쓰레드들이 스켜줄러에

의해 스케줄링 되지 않고 idle함수와 do_bottom_half만(타이머 인터럽트에

의한 ) 왔다갔다 하면서 먹통상태라는 거죠.....-_-

kernel_thread에서 호출하는 시스템 콜 중 sys_clone과 sys_exit에서 문제가

있지 않나 하고...그 쪽을 보고 있는데....영 까막눈이라...

원인을 찾기 어렵네요....

uclinux버그인가...? 쩝...

안녕하세요~
커널에서 허우적 거리고 있지만...
언젠가는 커널을 지배하는 날이 오리라 믿고
열심히 삽질하고 있습니다.
만나뵙게 되서 반갑습니다.

redhairs의 이미지

kernel_thread inline asm에 사소한 버그가 있었네요....

return되면 inline asm에서 exit시스템 콜을 호출해서

그 쓰레드를 소멸시켜 줘야 되는데....

PC값을 제대로 설정해주지 않는 instruction을 써서

exit이 수행되지 않았나봐요....그래서 그 넘이 좀비 프로세스 같이 되서..

뭔가 알수 없는 오묘한 증상을 보였던것 같습니당~

안녕하세요~
커널에서 허우적 거리고 있지만...
언젠가는 커널을 지배하는 날이 오리라 믿고
열심히 삽질하고 있습니다.
만나뵙게 되서 반갑습니다.

댓글 달기

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