ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 커널 분석을 위한 vim, ctag, cscope, tagbar 세팅
    공부 2018. 2. 20. 00:12

    리눅스 커널 분석을 위한 vim, ctag, cscope, tagbar 세팅

    지난 주말 커널 분석 수업을 들으면서 언젠간 해봐야지 마음먹었을 때 알아두면 편할것 같아서 정리.

    나는 원래 vim을 주 에디터로 쓰고 firefox에도 vim key binding을 해놓는 사람이라...

    리눅스 커널을 분석하려면 결국 리눅스환경에서 작업해야하는데 vim 커스터마이징을 안하는 사람들을 위한 글 + 알게된 팁들 정리용이다.

    작업 환경

    내가 작업을 진행한 환경은 Ubuntu 16.04, vim 8.0 을 이용했고 분석한 커널버전은 4.14.x대이다.

    리눅스 커널 소스코드는 www.kernel.org에서 다운 받을 수 있다.

    # jen6 at localhost.localdomain in ~/tmp [12:22:32]
    → wget 'https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.19.tar.xz'        
    --2018-02-19 12:22:35--  https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.19.tar.xz
    Resolving cdn.kernel.org (cdn.kernel.org)... 151.101.229.176, 2a04:4e42:36::432
    접속 cdn.kernel.org (cdn.kernel.org)|151.101.229.176|:443... 접속됨.
    HTTP request sent, awaiting response... 200 OK
    Length: 100845536 (96M) [application/x-xz]
    Saving to: ‘linux-4.14.19.tar.xz’
    
    linux-4.14.19.tar.xz                        100%[==========================================================>]  96.17M  17.3MB/s    in 6.5s    
    2018-02-19 12:22:42 (14.9 MB/s) - ‘linux-4.14.19.tar.xz’ saved [100845536/100845536]
    
    # jen6 at localhost.localdomain in ~/tmp [12:22:42]
    → tar -xvf ./linux-4.14.19.tar.xz   
    

     

    vim vundle설치

    vim vundle은 vim의 플러그인을 설치 및 관리해주는 툴이다. 플러그인을 깔아서 커스터마이징 하다보면 어느순간 ide만큼 편해진다. 설치는 깃허브 링크로 들어가서 Quick start에 들어가 있는대로 설치를 한다.

    간단하게 설명하자면

    1. ~/.vim/bundle 위 경로와 같이 홈폴더에 다음과 같은 경로로 폴더를 만들어준다.

    2. vundle을 클론 받는다

      git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
      
    3. .vimrc에 다음 내용을 추가해준다. 해당 내용은 간단하게 하기위해 주석과 필요없는걸 지웠다.

      Quick Start에 있는 vimrc에 자세한 설정방법이 있음으로 해당 링크에 있는 vimrc를 복사하길 추천한다.

      set nocompatible              " be iMproved, required
      filetype off                  " required
      
      set rtp+=~/.vim/bundle/Vundle.vim
      call vundle#begin()
      
      " let Vundle manage Vundle, required
      Plugin 'VundleVim/Vundle.vim'
      Plugin 'tpope/vim-fugitive'
      Plugin 'git://git.wincent.com/command-t.git'
      Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
      " Plugin 'ascenator/L9', {'name': 'newL9'}
      " 이부분에 플러그인 설치할 부분을 넣어주면 된다.
      
      " All of your Plugins must be added before the following line
      call vundle#end()            " required
      
      " 플러그인 설정 관련 부분은 vundle#end 밑에줄에 넣어주면 된다.
      filetype plugin indent on    " required
      
    4. vim을 켜고 :PluginInstall을 쳐서 실행시켜주면 플러그인들이 설치된다.

      이후에도 플러그인을 추가했다면 4번 과정을 해주면 된다.

       

    ctags

    ctags 설치

    ctags는 소스코드 안에 있는 여러 함수나 변수, 구조체들을 미리 인덱싱 해놓은 후 분석할 때 해당 정의로 바로 이동할 수 있게 도와주는 툴이다. C언어 이외에도 다양한 언어를 지원함으로 vim을 주 에디터로 쓴다면 설치하면 좋은 툴이다.

    1. 먼저 ctags를 설치해준다.

      exuberant-ctagsctag종류 중 하나로써 vim에서 ctags를 쓰기위해 기존 포맷에서 확장된 형태의 툴이다.

      # jen6 at localhost.localdomain in ~/tmp [12:24:03]
      → sudo apt-get install exuberant-ctags
      
    2. ctags를 쉽게 쓸 수 있게 해주는 easytags플러그인을 설치한다

      • .vimrc에 플러그인을 추가해준다.
      Plugin 'xolox/vim-easytags'
      " 추가후 vim에서 :PluginInstall을 해준다.
      
      • 그 후 다음 설정을 vimrc에 추가해준다.
      set tag=./tags;/
      " easy-tag
      " tags를 비동기로 불러와준다. (필수) tag사이즈가 커지게 되면 vim이 블록되는 시간이 길어져서 답답하다
      let g:easytags_async=1
      " highlight를 켜면 좋지만 이것도 속도가 느려진다.
      let g:easytags_auto_highlight = 0 
      " struct의 멤버변수들도 추적이 된다.
      let g:easytags_include_members = 1
      " 현재 프로젝트에서 쓰는 tags파일을 우선 로드하고 없을 경우 global tags를 로드한다.
      let g:easytags_dynamic_files = 1
      

    ctags 사용법

    먼저 프로젝트나 혹은 현재 폴더에 대해서 ctags가 소스를 분석하도록 해야한다.

    현재 폴더만 소스를 분석하게 하려면 ctags * 을 이용하면 되고 하위 디렉토리까지 모두 분석을 하고 싶다면 ctags -R . 을 이용하면 된다. easytags를 설치했다면 vim에서 :UpdateTags 를 하게되면 global tags를 업데이트 할 수 있다.

    이후 vim에서 쓰이는 단축키 들이다.

    • Ctrl + ] - 함수, 구조체가 정의되어있는 곳으로 이동한다.
    • Ctrl + t - 이동하기 전 소스코드 위치로 돌아온다.

    다른 명령어들도 있긴한데 이거 두 개만 알아도 쓸만하다. 다른 명령어가 궁금하다면 링크를 참조.

     

    cscope

    cscope를 쓰기 이전에는 이 함수들이 어디서 쓰이는지 혹은 전역변수들이 어디서 쓰이는지를 찾아야하는 경우 터미널 창에서 grep을 이용해야 했었다. cscope는 미리 소스코드에 대해 데이터베이스를 만들어 놓고 검색을 빠르고 편하게 할 수 있도록 도와주는 툴이다.

    cscope 설치

    1. cscope를 설치해준다

      # jen6 at localhost.localdomain in ~/tmp [23:02:28]
      → sudo apt-get install cscope
      
    2. cscopevim에서 편하게 쓸 수 있도록 도와주는 quickr-cscope.vim 플러그인을 설치한다.

      Plugin 'ronakg/quickr-cscope.vim'
      
    3. vimrc에 자동으로 cscope 데이터베이스를 로드해주는 함수를 추가한다.

      function! LoadCscope()
        let db = findfile("cscope.out", ".;")
        if (!empty(db))
          let path = strpart(db, 0, match(db, "/cscope.out$"))
          set nocscopeverbose " suppress 'duplicate connection' error
          exe "cs add " . db . " " . path
          set cscopeverbose
        " else add the database pointed to by environment variable 
        elseif $CSCOPE_DB != "" 
          cs add $CSCOPE_DB
        endif
      endfunction
      au BufEnter /* call LoadCscope()
      

      코드 출처

    cscope 사용법

    • C언어로 이루어진 프로젝트 폴더에서 cscope를 이용해 먼저 데이터베이스를 만들어 준다.
    # jen6 at localhost.localdomain in ~/research/linux-4.14.19/kernel [23:12:18]
    → cscope -RUbq  
    
    • quick-cscope를 설치했다면 단축키 바인딩이 되어있다.

      • \s - 커서에 해당하는 단어에 대한 모든 심볼을 찾아준다
      • \g - 커서에 있는 단어에 대한 정의(global definition)을 찾아준다
      • \c - 커서에 있는 함수명을 호출하는 부분을 찾아준다
      • \f - 커서에 있는 파일명에 대해 모든 파일을 찾아준다
      • \i - 커서에 있는 include하는 파일을 모두 찾아준다
    • 혹시 창이 나눠져서 당황했다면 ctrl + ww로 나뉘어진 창을 넘어다니면 된다.

    키바인딩이나 커스터마이징을 하고싶다면 다음 링크를 참조하자.

    자세한 사용법은 man cscope 직접 찾아봅시다.

     

    tagbar

    현재 파일내에 있는 함수, 구조체 정의들을 옆에 빠로 한번에 볼 수 있게 해주고 점프 해준다.

    tags를 이용하는 기능인데 은근 자주 쓰게되고 ide같은 화면을 만들 수 있다.

    tagbar 설치

    1. majutsushi/tagbar라이브러리를 설치해준다.

      Plugin 'majutsushi/tagbar'
      

    tagbar 사용법

    F8버튼을 누르면 다음과 같은 화면이 나온다. ctrl + ww로 창을 넘나들면 된다.

     

     

    Linux kernel에서 ctags, cscope 데이터베이스 생성하기

    최근 리눅스 커널 make파일에서는 ctagscscope 데이터베이스 파일을 알아서 만들어준다.

    # jen6 at localhost.localdomain in ~/research/linux-4.14.19 [23:35:53]
    → make ARCH=x86_64 cscope tags
    

    ARCH부분은 본인이 분석하길 원하는 아키텍쳐를 넣으면 된다.

    이렇게 하면 노트북 기준 10~20분 사이에 데이터베이스가 만들어진다.

    (멘토님은 이 기능을 보시곤 아니 이렇게 좋은 세상이 되었다니... 하면서 감탄하셨다.)

    +

    언젠간... 커널도 분석해서 글을 써야지... 언젠간...

    댓글

Designed by Tistory.