본문 바로가기

Embedded/Device Driver

Device Driver] 커널 메시지 출력

hello.ko 모듈을 올렸을때
Hello Wolrd가 나오지 않았을 수 있다.
그 이유를 알아보자

우선 이를 알기 위해서 printk() 함수에 대해서 알아야 할 것이다.
우리가 이때까지 응용프로그램에서 짜던 printf와는 다른 printk 이다.

※ printk()
커널 함수에서 사용되는 출력 함수이다.
printk와의 차이는 메시지 기록 관리를 위한 로그 레벨을 지정할 수 있다는 것이다. 
 로그 레벨  의미
"<0>"  ==  KERN_EMERG   시스템이 동작하지 않는다. 
"<1>"  ==  KERN_ALERL   항상 출력된다.
"<2>"  ==  KERN_CRIT   치명적인 정보
"<3>"  ==  KERN_ERR   오류 정보
"<4>"  ==  KERN_WARNING   경고 정보
"<5>"  ==  KERN_NOTICE   정상적인 정보
"<6>"  ==  KERN_INFO   시스템 정보
"<7>"  ==  KERN_DEBUG   디버깅 정보

이렇게 로그 레벨을 지정하는 이유는 kernel source내에서 우리가 원하는 정보만 캐치해서 볼 수 있게 하기 위한 것이다.
그냥 평상시에는 디버깅 정보, 시스템 정보, 정상적인 정보는 볼 필요가 없을 것이다.
우리가 보고싶은것은 요류, 경고에 관련된 4 이하의 내용을 보고 부팅시 이상이 있는지만 보면 될 것이다.

바로 이렇게 로그 레벨을 둠으로써 필요한 출력만 확인 가능하게 하는 것이다.

그럼 어떻게 보고싶은 레벨을 설정 할 수 있을까?

$ cat /proc/sys/kernel/printk 명령을 쳐보자.
그러면 다음과 같이 4개의 숫자가 나올 것이다.
3        4        1        7

위의 숫자를 앞에서 부터 알아보도록 하자!!

ㅡ.현재 로그레벨
이 레벨보다 높은 메시지만(숫자가 작은...) 출력을 해준다.
ㅡ.기본 로그레벨
printk() 함수를 입력하면서 별도로 로그레벨을 입력하지 않을 경우(hello.c 예제에서도 입력 안했다.)
default로 입력되는 로그 레벨이다. 
ㅡ.최소 로그레벨
부여할수 있는 최소 로그 레벨이다.
이 값이 1이라면 우리가 printk 함수를 입력하면서 0을 부여할 수 없다.
ㅡ.부팅시 로그레벨
말그대로 부팅시 출력될 레벨을 지정해주는 것이다.
7로 되어 있으면 모두다 보겠다는 것이다.

이 내용을 읽었으면 왜 Hello World가 보이지 않았는지 이해가 될 것이다.
그 이유는 현재 로그레벨보다 큰 숫자가 기본 로그레벨로 지정되어 있기 때문이다.
그래서 로그레벨을 주지않은 printk() 함수들은 출력되지 않았던 것이다.

출력되지 않았을 경우에 다음과 같은 명령어로 로그버퍼에 기록된 내용을 볼 수 있다.(출력되지 않은 녀석도 다 볼수 있다.)
dmesg
# cat /proc/kmsg