1. 커널 소스 다운로드 하기
- 커널 소스를 다운로드 하기 위해 다음 링크(https://www.kernel.org)에 들어가서 커널 버전을 다운로드 한다. 커널 분석에 사용하는 버전은 2.6.30.4로 하기로 결정
+ www.kernel.org 홈페이지에서 www.kernel.org/pub 링크에 접속해 linux -> kernel -> v.2.6 디렉토리 이동해 linux-2.6.31.4.tar.gz 파일 다운로드
+ 본 파일을 다운로드 하기 위해 링크 위치에서 wget으로 리눅스에서 다이렉트 다운로드 사용
haru@raspberrypi ~ $ mkdir LINuxKernel haru@raspberrypi ~ $ cd LINuxKernel haru@raspberrypi ~/LINuxKernel $ ls -l total 0
haru@raspberrypi ~/LINuxKernel $ wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.4.tar.gzharu@raspberrypi ~/LINuxKernel $ ls -l -rw-r--r-- 1 pi pi 78298418 Oct 12 2009 linux-2.6.31.4.tar.gz haru@raspberrypi ~/LINuxKernel $ |
2. 커널 소스 압축을 풀기위해 tar xvf 파일명을 이용하여 압축 해제
haru@raspberrypi ~/LINuxKernel $ pwd /home/haru/LINuxKernel haru@raspberrypi ~/LINuxKernel $ tar xvf linux-2.6.31.4.tar.gz .... haru@raspberrypi ~/LINuxKernel $ ls -al total 76468 drwxr-xr-x 23 haru link 4096 Apr 4 01:17 linux-2.6.31.4/ -rw-r--r-- 1 haru haru 78298418 Oct 12 2009 linux-2.6.31.4.tar.gz haru@raspberrypi ~/LINuxKernel $ |
3. ctags 와 cscope 설치
- ctags는 프로그램 소스로부터 태그를 생성해주는 프로그램. 인덱스를 생성시켜 데이터 베이스를 관리하고 정보 이용을 하여 vim 에서 소스 코드의 함수, 변수 등을 찾을 때 사용
- apt-get 을 이용하여 ctags 설치
haru@raspberrypi ~/LINuxKernel $ sudo apt-get install ctags ... haru@raspberrypi ~/LINuxKernel $ whereis ctags ctags: /usr/bin/ctags /usr/bin/X11/ctags /usr/share/man/man1/ctags.1.gz haru@raspberrypi ~/LINuxKernel $ |
- ctags를 생성하는 명령어는 해당 디렉토리에서 ctags -R을 사용하면 파일이 만들어짐. 우리 시그에서는 x86, mips, avr32, cris 등 많은 아키텍처가 있지만 ARM용으로 분석을 하기위해 make를 이용하여 arm 전용 ctags를 이용
haru@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ ls -al ./scripts/tags.sh
-rwxr-xr-x 1 haru link 4119 Oct 12 2009 ./scripts/tags.shharu@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ make tags ARCH=arm GEN tags '' 많은 시간이 필요... 화장실 다녀와도 됨 haru@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ ls -alh tags -rw-r--r-- 1 haru haru 95M Apr 4 00:08 tags |
- tags 파일의 내부 구조는 다음과 같음
tag_name<TAB>file_name<TAB>ex_cmd;"<TAB>extension_fields |
필드 이름 | 설 명 |
tag_name | 심벌 이름 |
file_name | 심벌이 위치한 파일 이름 |
ex_cmd | 파일에서 심벌을 찾을 때 사용하는 vim의 ex 모드에서 검색된 패턴의 정규식 |
extension_fields | 심벌의 타입, f = 일반 C 함수, c = 클래스, d = define 된 값 |
<표 1. tags 파일의 필드 의미>
- ctags는 소스 코드 심벌들에 대한 인덱스를 구성해주고 인덱스를 통해 심벌이 위치한 파일을 찾을 수 있지만 한방향으로만 검색이 가능하고, 이 함수를, 함수가 호출하는 함수들에 대한 출력이 불가능함
- 이를 극복하기 위해 cscope 태그 데이터베이스를 만듬
haru@raspberrypi ~/LINuxKernel $ sudo apt-get install ctags ... haru@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ whereis cscope cscope: /usr/bin/cscope /usr/bin/X11/cscope /usr/share/man/man1/cscope.1.gz haru@raspberrypi ~/LINuxKernel $ |
haru@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ make cscope ARCH=arm
GEN cscope '' 잠시 나가서 바람 좀 쐬고 와도 됨.. 아니 나가서 쐬야됨... 담배 탐..haru@raspberrypi ~/LINuxKernel/linux-2.6.31.4 $ ls -alh cscope.* -rw-r--r-- 1 haru haru 482K Apr 4 00:12 cscope.files '' 분석할 파일 리스트를 포함 -rw-r--r-- 1 haru haru 185M Apr 4 00:23 cscope.out '' 함수의 위치, 함수콜, 매크로함수, 전처리 심벌 등 실제 데이터베이스 -rw-r--r-- 1 haru haru 25M Apr 4 00:23 cscope.out.in '' 심벌 인덱스의 속도를 향상 시키기 위한 역 인덱스 -rw-r--r-- 1 haru haru 134M Apr 4 00:23 cscope.out.po '' 심벌 인덱스의 속도를 향상 시키기 위한 역 인덱스.2 |
4. ctags와 cscope 태그를 적용하기 위해 vim 플러그인 다운로드
- 해당 사이트 왼쪽 Script 에 Browse all 을 들어가 Source Exploerer, NERD Tree, Tag
5. 해당 다운로드 받은 파일을 압축 풀고 vim에 적용
haru@raspberrypi ~/.vim $ pwd /home/haru/.vim haru@raspberrypi ~/.vim $ mkdir plugin haru@raspberrypi ~/.vim $ mv ../Download/srcexpl.vim ./plugin/ haru@raspberrypi ~/.vim $ ls -al total x -rw-r--r-- 1 haru haru 47061 Apr 4 00:39 nerdtree.zip -rw-r--r-- 1 haru haru 51455 Apr 4 00:39 taglist_46.zip drwxr-xr-x 2 haru haru 4096 Apr 4 00:43 plugin/ haru@raspberrypi ~/.vim $ unzip nerdtree.zip ... haru@raspberrypi ~/.vim $ unzip taglist_46.zip ... haru@raspberrypi ~/.vim $ ls -al total 132 drwxrwxr-x 2 haru haru 4096 Apr 4 00:43 doc/ drwxrwxr-x 2 haru haru 4096 Dec 28 2011 nerdtree_plugin/ -rw-r--r-- 1 haru haru 47061 Apr 4 00:39 nerdtree.zip drwxr-xr-x 2 haru haru 4096 Apr 4 00:43 plugin/ -rw-r--r-- 1 haru haru 15078 Apr 4 00:39 SrcExpl-5.3.zip drwxrwxr-x 2 haru haru 4096 Dec 28 2011 syntax/ -rw-r--r-- 1 haru haru 51455 Apr 4 00:39 taglist_46.zip |
- vim 환경설정 .vimrc 파일 내용
1 set nu 2 set ai 3 set ts=4 4 set bg=dark 5 6 set tags=/home/haru/LINuxKernel/linux-2.6.31.4/tags 7 8 set csprg=/usr/bin/cscope 9 set csto=0 10 set cst 11 set nocsverb 12 13 cs add /home/haru/LINuxKernel/linux-2.6.31.4/cscope.out /home/haru/LINuxKernel/linux-2.6.31.4 14 set csverb 15 16 filetype on 17 nmap <F7> :TlistToggle<CR> 18 let Tlist_Ctags_Cmd = "/usr/bin/ctags" 19 let Tlist_Inc_Winwidth = 0 20 let Tlist_Exit_OnlyWindow = 0 21 22 let Tlist_Auto_Open = 0 23 let Tlist_Use_Right_Window = 1 24 25 nmap <F8> :SrcExplToggle<CR> 26 nmap <C-H> <C-W>h 27 nmap <C-J> <C-W>j 28 nmap <C-K> <C-W>k 29 nmap <C-L> <C-W>l 30 31 let g:SrcExpl_winHeight = 8 32 let g:SrcExpl_refreshTime = 100 33 let g:SrcExpl_jumpKey = "<ENTER>" 34 let g:SrcExpl_gobackKey = "<SPACE>" 35 let g:SrcExpl_isUpdateTags = 0 36 37 let NERDTreeWinPos = "left" 38 nmap <F9> :NERDTreeToggle<CR> 39 |
6. vim 실행
해당 최초 vim화면서 F7 F8 F9를 차례대로 누르게 되면 다음과 같은 상태창이 나오게 된다.
- 기본 ctag 사용법 : Ctrl + ] 함수가 정의 된 곳으로 이동
Ctrl + t 이동하기 이전 단계로 이동
....
'STUDY > Linux kernel' 카테고리의 다른 글
리눅스 커널 분석 환경 구축 (0) | 2014.04.06 |
---|