이번 주는 휴식하고, 다음주부터 본격적으로 커널 분석을 시작합니다.
소스 분석 도구는 각자 익숙한 도구를 사용하면 되겠지요.
윈도우 환경이 익숙하시다면 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
------------------------------------------------------------------------------------------------
댓글 0
.