do_exit 함수를 분석 중에 이해가 안되는 부분이 발생하였으나 도저히 해결이 안되어
고수님 분들께 자문을 구하고 싶습니다.

다음 코드는 저희 팀이 분석중인 4.16커널의 do_exit() 함수의 일부입니다.
저희가 적은 주석도 적혀있습니다. (모기향 책의 내용과 코드가 동일합니다.)

모기향 책 638쪽 코드 5-23의 2번 라인입니다.

 

 

      /*
       * We're taking recursive faults here in do_exit. Safest is to just
       * leave this task alone and wait for reboot.
       */
      //IMRT : 현재 태스크가 종료작업이 다른 곳에서 진행중인지 확인한다.
      //   - 동시에 종료작업이 수행되는 경우가 무엇인가??????????????
      //     하나의 task가 동시에 kernel context에서 수행될 수 있는것인가?
      if (unlikely(tsk->flags & PF_EXITING)) {
            pr_alert("Fixing recursive fault but reboot is needed!\n");                                                                                                                                     /*
             * We can do this unlocked here. The futex code uses
             * this flag just to verify whether the pi state
             * cleanup has been done or not. In the worst case it
             * loops once more. We pretend that the cleanup was
             * done as there is no way to return. Either the
             * OWNER_DIED bit is set by now or we push the blocked
             * task into the wait for ever nirwana as well.
             */
            tsk->flags |= PF_EXITPIDONE;
            // 중복되는 do_exit() 호출을 막기 위해 상태 변경하고
            set_current_state(TASK_UNINTERRUPTIBLE);
            // IMRT : 다른 태스크가 수행할 수 있도록 schedule() 호출함.
            schedule();
      }

      // PF_EXITING 설정하여 해당 태스크가 종료중임을 알린다.
      // 만약 태스크가 스레드이고 스레드에 pending 시그널이 있다면 대신 처리해줄 스레드를 스레드 그룹에서 찾아 해당 시그러널을 모두 처리하도록 설정한다.
      exit_signals(tsk);  /* sets PF_EXITING */

 


궁금한 것 첫 번째는 이 if문이 참이되는 상황이 발생하는가? 입니다.
if문의 조건부에서 tsk->flags가 PF_EXITING이 활성화 되는 곳은 if문 바깥은
exit_signals()함수가 유일합니다. 또한 이 함수는 do_exit()에서만 호출됩니다.
그렇다면 이 do_exit()함수가 두 번이상 호출되어야 이 if문을 들어오게 되는데,
이러한 "가능성"이 존재하는 지를 모르겠습니다.

 

예상한 가능성은 다음과 같습니다.
1. 싱글코어에서 한 태스크가 동작 중에 다른 태스크에서 kill 시그널을 날려
do_exit()을 다시 수행하게 된다. 즉, do_exit() 함수를 수행 하는 중에
kill 시그널이 들어와서 exit 시스템 콜을 호출하여 소프트웨어 인터럽트가
다시 발생하여 do_exit()을 다시 호출 (우선순위 전도로 인한 발생일 수도 있고)
2. 멀티코어에서 do_exit()을 동작하는 중에 다른 태스크에서 kill 시그널을 날려
1번과 같이 exit 시스템콜에 의한 kill
3. do_exit()이 동작 중에 높은 우선순위 태스크에 의해 선점당하였는데 해당 태스크에서
kill 시그널 전송하여 1번처럼 다시 exit 시스템콜 수행

 

do_exit()이 처리되고 있는 상황은 이미 kernel mode에서 수행되고 있을 터인데,
do_exit()의 중간에서 스케줄링 되었을 때, 해당 context를 저장하고 있을 텐데,
시그널에 의해 새로이 context가 갱신 될 수 있는지 모르겠습니다.

그 가능성이 아니면 도저히 위 if문의 조건을 충족시킬 수 있는 상황이 발생하는지 모르겠습니다.

 

 

 

두 번째 궁금한 것은, 위와 같이 signal이 발생한다면, signal을 발생하지 않게 만들지 않은 이유는
무엇일까요?
저 if문을 수행할 때'만' TASK_UNINTERRUPTIBLE로 만들어 스케줄링 해버립니다.
즉, 스케줄링도, 인터럽트도 받지 않는 좀비가 되어버리는 것이죠.
중복해서 do_exit()을 수행 시, 왜 좀비로 만들어버리는가? 이미 처리중인 do_exit()을 마무리하고
프로세스를 종료하면 되지 않는가?
만약 그것이 이점이 있다면 왜 진작 처음 do_exit()을 수행하는 중에 UNINTERRUPTIBLE로 만들어
시그널을 받지 않게 만들지 않았는가? TASK_KILLABLE로 만들기라도 하면 좋겠는데,
도저히 그런 부분을 찾을 수가 없네요...

이러한 궁금증이 생깁니다.

 

 

do_exit()함수는 마지막에서 do_task_dead()함수를 수행하며(모기향 책과는 조금 다름)
do_task_dead()에서 tsk->state를 TASK_DEAD로 바꾸고, 스케줄링합니다(모기향 책에서는 do_exit()에서 수행)
그렇다면, 위 if문을 충족시키는 경우는 do_exit()함수 안에서 다른 함수를 거쳐서
do_exit()을 재귀호출하게 되는 경우 밖에 없는 것 같은데, 이게 발생할 수 있는 사례인가요?
do_exit()을 하는 도중에 memory 요청을 했는데 fault가 나서 do_exit(SIGSEGV)가 발생한다거나...

 

 


답변 기다리겠습니다.
답변해주시면 정말 감사드리겠습니다.

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22247
517 alloc과 free함수에 대해서 질문입니다. [1] 정재훈 2011.06.28 93648
516 안드로이드 system 폴더안의 파일을 인식못하는데.. [5] 김영일 2011.04.14 69696
515 x86에서 ZONE_DMA 영역의 사용 [1] 홍문화 2011.05.02 58286
514 커널에서 page alloc에 관해서 [1] 미다리로23 2017.02.05 34574
513 디바이스 드라이버 모듈에서 작성한 함수를 커널에서 사용하는 방법 [1] 개짖는소리 2017.02.06 27047
512 Linux kernel의 CFS(Completely Fair Scheduling) 스케줄러에서 time slice 구하는 방법? [10] 김재호 2010.04.30 25224
511 "만들면서 배우는 OS..." 4장 kernel.asm 중 idtr 설정 질문드립니다 쿨쿨 2013.06.18 24957
510 리눅스 스케줄러 관련 [9] 홍문화 2011.02.23 22948
509 NFS NAS SAN 이란 무엇인가? file 박은병 2010.04.13 21880
508 s3c2440기반의 리눅스 커널 분석 중 MM관련 질문입니다. 유태경 2007.09.02 21523
507 /dev 폴더에 있는 node파일 중에서 어떤 것을 open해야 플래쉬를 사용할 수 있을까요? [1] 박종주 2012.02.17 19849
506 sparsemem에 대한 질문이 있습니다. [5] 안정모 2010.03.20 19717
505 16기 리눅스 커널 스터디 C조 18주차 질문입니다. [3] cien 2019.10.12 18829
504 tty, tty0, console, vc 는 각각 뭐하는 디바이스인지? [3] 이창만 2008.12.04 18555
503 ARM A8 이상의 프로세서를 공부할 때 스터디 방향 [4] 유강희 2011.06.15 18516
502 임베디드 OS 만들기 내용과 관련하여 문의드립니다. [5] 송인재 2010.03.25 18321
501 far call 이란 무엇인가요? [4] 박한범 2010.04.13 17840
500 파일시스템에 관한 질문(Htree [6] 사앙조 2017.05.22 17069
499 SMP관련 질문입니다. [2] 컴퓨터 2017.04.13 16584
XE Login