Embedded : : Linux/: : Linux Kernel

커널 로그 분석: WARN 매크로

Jay.P Morgan 2024. 10. 31. 22:45

 

  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