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.gz
haru@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.sh
haru@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




List 를 다운로드

 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      이동하기 이전 단계로 이동
                               ....





저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'STUDY > Linux kernel' 카테고리의 다른 글

리눅스 커널 분석 환경 구축  (0) 2014.04.06

Comment



티스토리 툴바