안녕하세요.
제가 임베디드 커널 쪽 코딩 중에 어떤 문제에 봉착해서 이렇게 질문 드립니다.

어떻게 이런 상황이 되는지에 대해서, 가능성이 있을법한 이슈들에 대해 알려주셨으면 합니다.
아래 코드 확인 부탁 드립니다. (참고로 cpu는 i386 아키텍처 입니다.)

---------------------------------------------------------------------------------------------------------------------------------

int example_function(int a... ) {
        if (in_interrupt()) // <1> DEBUG
            printk("%s 0-1 atomic operation\n", __FUNCTION__);
 
        // 문제가 되는 시점입니다!!
        RET_VAL         ret;
        int             i, j, MSB=0, WindowSize;
        DIGIT           *P1, *P2, *P3;
 
        if (in_interrupt()) {// <2> DEBUG
            printk("%s 0-2 atomic operation\n", __FUNCTION__);
 
            if (in_irq())
                printk("0-2 hardirq context\n");
            if (in_softirq())
                printk("0-2 softirq context\n");
        }
 
        // 중략
}

---------------------------------------------------------------------------------------------------------------------------------

 

위 코드의 결과는,
example_function 0-1 not atomic operation
example_function 0-2 atomic operation
0-2 hardirq context
입니다.

 

이 코드는 어떤 루틴 중에 수행되는 함수의 일부분을 적절히 편집한 것입니다.

<1> DEBUG 부분에서는 in_interrupt()에 대한 리턴이 0으로 들어오는데요.
(즉 선점 가능한게죠.)
<2> DEBUG 부분에서는 in_interrupt(), in_irq()에 대한 리턴이 1보다 큰 값, 즉 참으로 들어옵니다.
(이때부터 선점이 불가능한 인터럽트 컨텍스트가 수행되는게 맞나요? ㅎㅎ;)

 

그리고는 해당 루틴이 끝난 후에는 스케줄링이 걸리는 부분이 있어서 죽어버리는데요..;;
이 부분에서 제가 잘 모르겠는 부분은요.
어떻게 변수 선언 전에는 인터럽트 컨텍스트가 아니었는데 변수 선언 하면 인터럽트 컨텍스트로 바뀌게 되는지 궁금합니다.

 

코드가 수행 중인 환경은요,
커널에서 커널 모듈의 함수를 콜해서 모듈의 함수를 수행하고, 다시 커널로 돌아오고서 죽는 상황이거든요? ;;

 

제가 막연히 추측하는건, 퀀텀 시간을 다 소비해서 타이머 인터럽트가 걸린게 아닐까.... 하는게 허접한 제 생각입니다.

아래는 트랩 정보 입니다.
---------------------------------------------------------------------------------------------------------------------------------

<3>BUG: scheduling while atomic: xxxxx/0x2dbcb4ae/206
 [<40534ce6>] __sched_text_start+0x4e6/0x870
 [<40124280>] lock_timer_base+0x20/0x50
 [<401243b4>] __mod_timer+0x94/0xb0
 [<4053581a>] schedule_timeout+0x4a/0xc0
 [<40123a30>] process_timeout+0x0/0x10

---------------------------------------------------------------------------------------------------------------------------------

 

고수님들의 생각은 어떠신지 궁금해서 이렇게 질문 드립니다.
긴 글 읽어주셔서 감사합니다.