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





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

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

Comment

+ 커널 소스 트리
디렉토리설명
arch특정 아키텍처와 관련된 소스
block블록 입출력 계층
crypto암호화 API
Documentation커널 소스 문서
drivers장치 드라이버
firmware특정 드라이버를 사용할 때 필요한 장치 펌웨어
fs가상 파일 시스템 및 개별 파일시스템
include커널 헤더 파일
init커널 시작 및 초기화 관련 코드
ipc프로스세스 통신 관련 코드
kernel스케줄러와 같은 핵심 커널 서브시스템
lib유틸리티 루틴
mm메모리 관리 서브시스템 및 가상 메모리
net네트워크 서브시스템
samples예제, 데모 코드
script커널을 빌드하는 데 사용하는 스크립트
security리눅스 보안 모듈
sount사운드 서브시스템
usr초기 사용자 공간 코드 initramfs
tools리눅스 개발에 유용한 도구
virt가상화 기반 구조


Comment


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

 

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

 

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

 

 

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

vim, cscope, ctagstaglist.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

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

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

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

 

vimcscope를 연동해 사용하기 위해 다음 파일을 다운로드 받아 $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

"TABspace로 치환

"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

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

 

 

Comment



티스토리 툴바