커널 소스 분석에 도움을 주는 도구들

구본규 2012.08.06 15:19 조회 수 : 12006

이번 주는 휴식하고, 다음주부터 본격적으로 커널 분석을 시작합니다.


소스 분석 도구는 각자 익숙한 도구를 사용하면 되겠지요.


윈도우 환경이 익숙하시다면 source insight(유료)를 쓰시거나 slickedit, eclipse 등 편한 IDE를 사용하시면 될 것 같습니다.



저는 리눅스 터미널에서 vim에 cscope와 plugin 연동해 쓰는 게 편합니다.

vim, cscope, ctags에 taglist.vim, The NERD tree, srcexpl.vim을 추가로 사용합니다.



1. vim

vim 사용법은 구글링 하시면 잘 정리된 문서들도 있고,

'손에 잡히는 vim'이 한글로 쉽게 쓰여졌다고 알고 있습니다.


일단 기본적인 커서 이동, 편집 관련 명령만 익히고 필요할 때마다 부가 기능을 익히고 있습니다.



2. ctags

ctags는 이름에서 알 수 있듯 키워드에 대해 tag파일을 생성하고, 그것으로 source를 브라우징 하는 도구입니다.


배포판 저장소에서 ctags 패키지를 설치하고, 아래 내용을 $HOME/.vimrc에 등록해 사용하고 있습니다.

------------------------------------------------------------------------------------------------

" ctags plugin

"set tags=./tags,../tags,../../tags,../../../tags,../../../../tags
set tag=./tags;/

------------------------------------------------------------------------------------------------


tags 파일은 분석할 소스의 $(TOPDIR)에서 ctags -R로 생성합니다.


쉘에서 man tags, 또는 vim 내에서 :help tags를 입력해 도움말을 얻으면 됩니다.



3. cscope

cscope는 ctags과 함께 강력한 소스 브라우저 도구입니다.

vim, ctags, cscope만 사용해도 주로 사용하는 필요한 브라우징은 다 됩니다.


배포판 도구를 사용해 cscope 패키지를 설치하고, 환경변수를 등록한 후

export CSCOPE_EDITOR=vim


아래 내용을 mkcscope.sh로 만들어 PATH 잡힌 디렉토리에 넣어두고,

분석할 소스 디렉토리의 $(TOPDIR)에서 mkcscope.sh 명령을 입력하여 사용하고 있습니다.


------------------------------------------------------------------------------------------------

#!/bin/bash

rm -rf cscope.files cscope.out                                                                                                                                     

find `pwd` ( -name '*.c' -o -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.s' -o -name '*.S' ) -print > cscope.files

cscope -i cscope.files

------------------------------------------------------------------------------------------------


vim과 cscope를 연동해 사용하기 위해 다음 파일을 다운로드 받아 $HOME/.vim/plugin 디렉토리에 넣어두고 사용하면 편리합니다.

http://cscope.sourceforge.net/cscope_maps.vim


(키워드 위에서 Cntl + + 명령의 조합으로 search가 가능합니다. plugin 디렉토리가 없다면 직접 만드시고요)



커널은 Makefile에서 tags, cscope 생성 옵션을 제공해 주므로 mkcscope.sh 실행할 필요없이

다음과 같이 입력하면 생성 가능합니다. (iamroot 강좌/팁 게시물 참고)

$ make ARCH=arm tags cscope



4. vim plugin

여기에 source insight와 같은 효과를 내기 위해 다음 툴들을 사용합니다.

srcexpl, taglist, NERD_tree


순서대로

source insight처럼 화면에 함수, 타입 정의 보여주기,

tags 파일을 바탕으로 파일에서 사용하는 심볼을 리스트 형식으로 보여주기,

디렉토리 탐색 기능 강화

입니다.


vim 사이트를 보시면 각 플러그인 파일과 설치 방법이 잘 나와 있습니다.

http://www.vim.org/scripts/script.php?script_id=273
http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=2179


구글링 해보시면 각각 한글로 정리된 문서들이 있습니다.

plugin 파일을 $HOME/.vim/plugin에 다운 받고, .vimrc에 환경변수를 등록해 사용하는 패턴은 동일합니다.


위 세가지 플러그인을 설치하고, 세 플러그인들을 함께 관리하기 위한 trinity라는 플러그인도 있습니다.

저는 오히려 불편해서 사용하지 않고 있지만요.



다음은 제가 사용하는 .vimrc 파일입니다.

------------------------------------------------------------------------------------------------

"help OPTION                                                                                                                                                       

syntax on

set encoding=utf-8
set fileencodings=utf-8,euc-kr

"탭 하나의 크기를 4로 설정
set tabstop=4
set shiftwidth=4
set softtabstop=4

set autoindent
"TAB을 space로 치환
"set expandtab
"Display line number
set number
"numberwidth
set numberwidth=8

"소스 폴딩
"set foldmethod=marker


"하단에 상태 표시줄
set laststatus=2
set statusline=%<%F%h%m%r%h%w%y %{strftime("%Y/%m/%d-%H:%M")}%= col:%c%V ascii:%b pos:%o lin:%l,%L %P

"붙이기 모드로 전환
set paste

"마우스 사용
"set mouse=an

"highlight previous search pattern
set hlsearch

"show cursor line
set cursorline

color torte

"Ignore Case
" set ic

"Clipboard
set cb=unnamed
"show match bracket
"set showmatch
"set matchtime=5


"Window Fix Width
"set wfw
"set wfh



if &term =~ "xterm"
  if has("terminfo")
    set t_Co=8
    set t_Sf=^[[3%p1%dm
    set t_Sb=^[[4%p1%dm
  else
    set t_Co=8
    set t_Sf=^[[3%dm
    set t_Sb=^[[4%dm
  endif
endif

" Taglist plugin
filetype on
nnoremap <silent> <F2> :TlistToggle<CR>
let Tlist_Ctags_Cmd = "/usr/bin/ctags"
let Tlist_Inc_Winwidth = 0
let Tlist_Exit_OnlyWindow = 0
let Tlist_Auto_Open = 0
let Tlist_Use_Right_Window = 1

" Source Explorer plugin
nnoremap <silent> <F3> :SrcExplToggle<CR>

"nmap <F8> :SrcExplToggle<CR>
nmap <C-H> <C-W>h
nmap <C-J> <C-W>j
nmap <C-K> <C-W>k
nmap <C-L> <C-W>l

let g:SrcExpl_winHeight = 8
let g:SrcExpl_refreshTime = 100
let g:SrcExpl_jumpKey = "<ENTER>"
let g:SrcExpl_gobackKey = "<SPACE>"
let g:SrcExpl_isUpdateTags = 0


" NERDTree plugin
let NERDTreeWinPos = "left"
nnoremap <silent> <F4> :NERDTreeToggle<CR>
" nmap <F9> :NERDTreeToggle<CR>


" ctags plugin
"set tags=./tags,tags,../tags,../../tags,../../../tags,../../../../tags
set tag=./tags;/

------------------------------------------------------------------------------------------------



.bash_profile에 다음을 추가합니다.

------------------------------------------------------------------------------------------------

TERM=xterm-color

export CSCOPE_DB=/tmp/cscope.out

------------------------------------------------------------------------------------------------

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2194
1725 [잡담] O(1) 스케쥴러에서 [5] 박은병 2008.04.02 13742
1724 u-boot 분석 참고자료 file 구본규 2012.07.27 13313
1723 [추가] linux, busybox .config / build 방법 [4] file 구본규 2012.07.29 13178
1722 CFS 스케줄러 기초 정리 홍문화 2011.05.27 12874
1721 이클립스에서 ARM Linux 개발 툴 사용하기(DS-5) [1] file 와사 2013.08.15 12867
1720 x86 linux booting 과정 file 백창우 2007.02.23 12734
1719 [문의] linux device driver 개정 3판 가지고 계신분? [6] 맥주 2008.03.27 12442
1718 링크 레지스터 오프셋 [6] 정현철 2011.06.12 12360
1717 안녕하세요~ 소성은 입니다~ [5] file 소성은 2010.04.05 12159
1716 [문서] 커널 분석 문서입니다. file 맥주 2008.11.10 12087
» 커널 소스 분석에 도움을 주는 도구들 구본규 2012.08.06 12006
1714 RealMode? ProtectedMode? [2] 김태훈91 2012.05.11 11951
1713 linux부팅과정 설명 문서 [3] file 이상철 2009.03.18 11768
1712 ELF 파일 포맷 정리 [6] 도영주 2013.05.04 11536
1711 [x86] fixed_addresses pororo 2012.03.04 11498
1710 kernel stack과 이를 이용하는 context_switch()사이의 연관성에 대한 질문 [11] 이종인 2011.05.27 11433
1709 memory map in powerpc kernel [1] file 김강년 2007.07.08 11267
1708 커널 스터디 6기 멤버 소개(arm-11 mp-core) 소개 페이지로 이동 예정 [4] 강진성 2010.03.24 11224
1707 리눅스 커널 초기화(ARM) 참고 자료 [2] file 유강희 2010.04.07 11221
1706 다들 주무시죠?? 자~ 질문입니다 ㅋ [4] 변유준 2007.06.16 11220
XE Login