1. 커널 로그 분석 방법
1.1 커널 로그 분석 순서
1. 오류 메시지를 커널 어느 코드에서 출력했는지 확인한다.
2. 소스코드에서 에러 메시지를 출력한 이유를 살펴본다.
3. 필요에 따라 디버깅 코드를 작성해 다시 문제가 발생했을 때 추가 커널 로그 확보를 시도한다.
1.2 WARN 매크로
WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n", irq_desc_get_irq(desc));
WARN 매크로를 어떤 함수에서 실행되면 시스템 정보를 커널 로그로 출력한다.
1. 콜스택
2. 현재 수행중인 프로세스 정보 : CPU 번호, 프로세스 이름, pid
3. 함수 이름과 라인 정보
WARN 매크로는 시스템에 뭔가 논리적 오류가 있을 경우에 발생한다. (반드시 디버깅해야함)
WARN () 매크로가 발생했을 때의 커널로그
WARNING: at kernel/irq/manage.c:225 __enable_irq+0x3b/0x57()
Unbalanced enable for IRQ 4
Modules linked in: svsknfdrvr [last unloaded: osal_linux]
Pid: 634, comm: ash Tainted: G W 2.6.28 #1
Call Trace:
[<c011a7f9>] warn_slowpath+0x76/0x8d
[<c012fac8>] profile_tick+0x2d/0x57
[<c011ed72>] irq_exit+0x32/0x34
[<c010f22c>] smp_apic_timer_interrupt+0x41/0x71
[<c01039ec>] apic_timer_interrupt+0x28/0x30
[<c011b2b4>] vprintk+0x1d3/0x300
[<c013a2af>] __setup_irq+0x11c/0x1f2
[<c013a177>] __enable_irq+0x3b/0x57
[<c013a506>] enable_irq+0x37/0x54
[<c68c9156>] svsknfdrvr_open+0x5e/0x65 [svsknfdrvr]
[<c016440a>] chrdev_open+0xce/0x1a4
[<c016433c>] chrdev_open+0x0/0x1a4
[<c01602f7>] __dentry_open+0xcc/0x23a
[<c016049a>] nameidata_to_filp+0x35/0x3f
[<c016b3c5>] do_filp_open+0x16f/0x6ef
[<c0278fd5>] tty_write+0x1a2/0x1c9
[<c0160128>] do_sys_open+0x42/0xcb
WARNING 발생위치: MANAGE.C:225
__enable_irq 함수 - 콜스택
그렇다면 MANAGE.C __enable_irq()함수를 보자
1 void __enable_irq(struct irq_desc *desc)
2 {
3 switch (desc->depth) {
4 case 0:
5 err_out:
6 WARN(1, KERN_WARNING "Unbalanced enable for IRQ %d\n",
7 irq_desc_get_irq(desc));
코드 분석
인터럽트 디스크립터의 (struct irq_desc *)desc->depth 멤버는 인터럽트를 enable 할 때 0, disable 할 때 1을 설정한다.
그런데, 아래 6번째 줄 코드는 인터럽트를 2번 enable 했을 때 실행한다.
그렇다면 오류가 난 이유 ?
인터럽트를 2번 enable해서이다.
'Embedded : : Linux > : : Linux Kernel' 카테고리의 다른 글
Linux Module (0) | 2024.11.06 |
---|---|
[Linux Kernel] configuration file (0) | 2024.10.31 |
Debugging the kernel using Ftrace (4) | 2024.10.24 |
태스크 디스크립터: 프로세스 간 관계 (0) | 2024.10.12 |
커널 스레드 (0) | 2024.10.12 |