본문 바로가기
프로그램.../프로....Kernel

[커널 패닉] 디버깅을 위한 사전 필요 지식

by 크크다스 2014. 10. 17.
반응형

= Kernel Panic을 분석하기 위해서 필요한 것들

http://www.iamroot.org/xe/index.php?mid=QnA&document_srl=179706&sort_index=regdate&order_type=desc

ARM의 경우를 기준으로 말씀드리자면 (다른 칩도 비슷합니다.)

 

기본적으로 ARM register들에 대한 기본 지식이 있어야 합니다.

각 register는 특별한 목적을 가진 것도 있고 범용인 것도 있습니다.

이중 PC, LR, SP register는 필수적으로 아셔야 합니다.

추가로 pipeline에 대해서도 알고 계셔야 합니다.

 

그 다음 함수가 불릴때 저 register들이 어떻게 쓰이는지를 알아야 합니다.

가장 필수적인 사항중 하나가, 왜 LR register의 값을 stack에 넣느냐 입니다.

이 부분은 function call 되는 과정을 이해하는 데 있어 필수입니다.

 

임베디드 레시피 사이트에 있는 자료를 한번 읽어보세요...

하기 귀찮은 자료 정리를 해놨네요..

ⓖ Stack 동작의 비밀과 실제 메모리 덤프
 
위 링크가 모든 것을 설명한다고 보진 않습니다. 기본적으로 알아야 할 부분들이라고 봅니다.
설명이 어렵게 느껴질 수 있지만 실제 덤프의 내용을 봐가면서 보면 이해가 더 낫습니다.
물론 실제 덤프를 볼 수 있는 기회가 직장에서 업무로 하는 것이 아닌 이상 흔치 않은 것이 함정이지만요...

제가 말씀드린 부분은 clue를 찾기 위한 방법입니다.

 

실질적으로 커널 패닉을 분석하기 위해서 필요한 것은

 

- 커널 패닉이 발생한 부분에 대한 이해 및 분석

- 덤프에서 clue를 찾기위한 방법, 램 및 register를 뒤져서 실행상태에서 어떤 일이 일어났는지에 대한 clue를 분석 수집하고

  이를 위해 코드와 연계해서 분석하는 것입니다.

 

당연히 패닉이 발생한 부분의 코드에 대한 이해는 필수이고,

덤프에서 왜 발생했는지를 알아내기 위한 clue를 찾기 위해, 예를 들자면, arm 의 경우 arm 칩의 register들과 쓰임새에 대해

알고 있어야 하는 것이죠, 이를 바탕으로 문제 당시에 함수들이 어떤 context로 실행되었는지를 확인하고

이를 분석하는 것입니다.

 

당연히 C에 대해서는 알고 계셔야 하구요, assembly 언어도 알아야 합니다. 정확하게는 문제가 생긴 부분의 c code에 해당하는 assembly code로 어떤 부분인지 확인하고 어떤식으로 실행되고 있는지를 알아야 실제 문제가 난 부분에 대한 자세한 분석이 됩니다.

 

디버깅이라는 것은 전체적으로 모든 부분을 어느정도 다 알고 계셔야 합니다.

해당 패닉 발생한 부분의 소스에 대한 이해가 있어야 하고,

C는 기본이고, target이 ARM이라면 ARM의 동작방식도 알아야 하고, OS가 어떤식으로 동작하는지도 어느정도 알아야 하고

컴파일러에 의해서 어떤 식으로 C code가 컴파일되어지는 지도 알아야 하고, 실질적으로 문제가 난 부분은 c code상으로는 잘 보이지 않을 수 있기 때문에 assembly 언어에 대한 이해도 필요합니다.(짤 수준은 안되도 짜여진 코드를 이해는 할 수 있어야 합니다.)

 

쉬운 문제들은 패닉 덤프의 커널 로그만으로도 분석이 가능한 경우도 있지만, 이 경우에는 가장 쉬운 경우이기 때문에.

코드의 논리를 파악해서 분석이 가능한 경우입니다.

 

위에 링크를 걸어드린 것은 코드 논리로만으로 clue를 찾을 수 없을 경우 실행 context에서의 변수 값 이나 실행 과정등을 면밀히 분석하기 위한 기반 지식들입니다.


이 부분조차도 이해가 안되신다면 우선 C 언어 공부와 더불어 컴파일 된 assembly code를 공부해보시는 것을 추천드립니다.

C code  가 어떤 내용의 assembly code로 되어있는지를 공부하시면 위 링크를 공부하시는데 도움이라 되시리라 봅니다.



반응형

'프로그램... > 프로....Kernel' 카테고리의 다른 글

[Kernel-Make] the Kernel Build System (kbuild)  (0) 2014.10.31
[고급 스킬] from Linux Kernel  (0) 2014.10.29
[Magic SysRq Key] Setting  (0) 2014.10.19
[커널 패닉] 디버깅  (0) 2014.10.17
[Debugging] Kernel panic  (0) 2014.10.16