Kernel_thread로 실행하는 함수에서 return하면 어떻게 되는지요
글쓴이: redhairs / 작성시간: 수, 2003/03/12 - 10:53오전
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에 아무런 값을 안주고 그냥 쓰레기 값을 리턴해도
상관없는 것인지도 알려주시면 감사하겠습니다.
Forums:
return 값에 대해서.
thread는 자신의 작업을 종료할때 리턴을 하게됩니다.
보통 detach된 경우는 그냥 없어지고 ,아닌 경우는 리턴값을 특정주소에 보관했줍니다.
제대로 소스를 파악하시고 계신것 같네요. ^^*
========================================
* The truth will set you free.
좀 더 자세히....
네.....음....
정상적인 경우라면 return을 하건...
return을 하지 않고 무한 루프를 돌건 별 상관이 없을거라 여겨지는데....
제 지금 증상은 비정상적인 상황인것 같아서...질문을 드린겁니다....
즉 return하지 않고 무한루프만을 계속 도는 경우에는 (쓰레드가 소멸되지
않는 경우) 문제없이 부팅이 되는데...( = 스케줄러가 정상동작하여 나머지 커널
쓰레드들이 스케줄링 됨 )
return을 하게 되면(쓰레드가 소멸되면 ) 다른 커널쓰레드들이 스켜줄러에
의해 스케줄링 되지 않고 idle함수와 do_bottom_half만(타이머 인터럽트에
의한 ) 왔다갔다 하면서 먹통상태라는 거죠.....-_-
kernel_thread에서 호출하는 시스템 콜 중 sys_clone과 sys_exit에서 문제가
있지 않나 하고...그 쪽을 보고 있는데....영 까막눈이라...
원인을 찾기 어렵네요....
uclinux버그인가...? 쩝...
안녕하세요~
커널에서 허우적 거리고 있지만...
언젠가는 커널을 지배하는 날이 오리라 믿고
열심히 삽질하고 있습니다.
만나뵙게 되서 반갑습니다.
해결했습니다.^^
kernel_thread inline asm에 사소한 버그가 있었네요....
return되면 inline asm에서 exit시스템 콜을 호출해서
그 쓰레드를 소멸시켜 줘야 되는데....
PC값을 제대로 설정해주지 않는 instruction을 써서
exit이 수행되지 않았나봐요....그래서 그 넘이 좀비 프로세스 같이 되서..
뭔가 알수 없는 오묘한 증상을 보였던것 같습니당~
안녕하세요~
커널에서 허우적 거리고 있지만...
언젠가는 커널을 지배하는 날이 오리라 믿고
열심히 삽질하고 있습니다.
만나뵙게 되서 반갑습니다.
댓글 달기