뜨아....
Pid: 0, comm: swapper
CPU: 0 Not tainted (3.0.35-2666-gbdde708 #239)
PC is at default_idle+0x24/0x28
LR is at ca9_do_idle+0x10/0x28
pc : [<c008f794>] lr : [<c00992e0>] psr: 80080013
sp : c04a3fc0 ip : 00000001 fp : 00000000
r10: 00000000 r9 : 412fc09a r8 : 10004059
r7 : c04a793c r6 : c04e4584 r5 : c04a7944 r4 : c04a2000
r3 : 00000067 r2 : 0002fe62 r1 : 00000000 r0 : 00000004
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 10c53c7d Table: 2a4b4059 DAC: 00000015
bad: scheduling from the idle thread!
[<c0094940>] (unwind_backtrace+0x0/0xf0) from [<c00af244>] (dequeue_task_idle+0x40/0x64)
[<c00af244>] (dequeue_task_idle+0x40/0x64) from [<c00ae3f0>] (dequeue_task+0x30/0x34)
[<c00ae3f0>] (dequeue_task+0x30/0x34) from [<c00ae428>] (deactivate_task+0x34/0x44)
이런게 나왔다.... 나와서 저것만 무한루프로 출력된다....
밑줄친 붉은글씨를 구글링해보니 interrupt handler에서 msleep과 같은 delay기능(?)이 있는 함수를 사용했을 때 발생한다고 한다.
interrupt handler에서 발생한 것은 맞고 msleep과 같은 그런 함수는 사용하지 않았다.
하지만 사용한 함수를 따라가보면 그 함수가 있을것만 같다........... 함수를 분석해본다.
wait_for_complition()라는 놈이 나왔다 수상하다....
쭉 따라가보니 그 수상한 넘이 나온다 나와!!
might_sleep();
이것이 원인이었다. 이것을 처리할 방법이 있는가. 꼭 인터럽트가 발생했을 때 처리해야하는데.....
그렇다면 thread를 하나 만들어서 대기시킨 후, interrupt handler에서 thread에 명령하여 처리하는 쪽으로 해보겠다.
그게 리눅스 커널에서 되는지 모르겠어요...;;
interrupt 발생시 kthread를 실행하고 종료하도록.
아 그러고보니 그 공유자원인 data전역변수는 mutex를 해주는게 맞을 것 같네.....
'개발Study > Linux' 카테고리의 다른 글
openssl / openssh build (0) | 2021.12.13 |
---|---|
filesystem size 변경 (0) | 2021.11.10 |
uImage와 zImage (0) | 2017.05.03 |
댓글