본문 바로가기
개발Study/Linux

Linux kernel panic debugging

by happy90 2017. 2. 24.
SMALL

뜨아....


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를 해주는게 맞을 것 같네.....







LIST

'개발Study > Linux' 카테고리의 다른 글

openssl / openssh build  (0) 2021.12.13
filesystem size 변경  (0) 2021.11.10
uImage와 zImage  (0) 2017.05.03

댓글