개발

linux kernel, vscode 연동

리눅스 커널은 수많은 파일들로 구성되어 있습니다. vscode로 열어보면 평소에 사용하던 '함수의 정의로 이동'이 보이지 않습니다.

 

tag를 이용한 방법을 소개합니다.


GNU Global

 

정의를 찾기 위해 vscode의 C/C++ extension을 설치합니다.

이것을 설치하면 다음과 같이 정의로 이동 기능이 활성화된 것을 확인할 수 있습니다.

정의로 이동과 함께 추가해야 할 기능이 더 있습니다.

함수의 reference를 확인하는 기능을 추가해야 합니다. 많은 아키텍처와 파일들로 구성되어 있기에 정확한 곳을 찾는 것이 중요합니다. 

 

이 extension을 사용하기 위해서 global gnu를 설치합니다.

www.gnu.org/software/global/globaldoc_toc.html

 

Tutorial

Specify the mapping of language names and plug-in parsers. Each part delimited by the comma consists of a language name, a colon, the shared object path, an optional colon followed by a function name. If the function name is not specified, ’parser’ is

www.gnu.org

설치를 하는 경우 Permission denied가 발생할 수 있습니다. sudo를 붙여도 전체에 권한을 주는 것은 위험하다며 오류를 반환합니다.

Error: Running Homebrew as root is extremely dangerous and no longer supported.

이와 같은 경우 폴더에 권한을 주어 해결합니다.

 

로그인 계정이 admin 이고 설치하고자 하는 경로가 /usr/local/bin/global 라면 다음과 같이 권한을 부여합니다.

 

sudo chown -R admin /usr/local/bin/global

 

gnu global을 설치한 후에 linux 폴더로 이동하여 다음 명령어를 입력합니다.

gtags

GPATH, GRTAGS, GTAGS 파일이 생성됩니다.

 

vscode는 이 세 파일을 사용하여 reference를 알려줍니다. 설치한 후에 vscode를 재실행합니다.

Peek Definition을 통해 다음과 같이 호출된 파일과 호출된 횟수를 확인할 수 있습니다.

 

두 extension과 gnu global을 설치하여 리눅스 커널을 vscode와 연동했습니다.

 

gnu global 홈페이지에서 API를 제공합니다. terminal을 사용하여 정보를 확인할 수 있습니다.

 

예를 들어, 함수를 찾기 위해서 global 명령어를 사용합니다.

global start_kernel		//global (함수 이름)

다음과 같은 결과를 출력합니다.

arch/alpha/boot/bootp.c
arch/alpha/boot/bootpz.c
arch/alpha/boot/main.c
init/main.c

 

심볼 이름을 까먹은 경우 다음과 같이 일부만 작성하여 전체를 확인합니다. -c는 complete입니다.

global -c kmem 
더보기
kmem_alloc
kmem_alloc_io
kmem_alloc_large
kmem_cache
kmem_cache_alloc
kmem_cache_alloc_bulk
kmem_cache_alloc_node
kmem_cache_alloc_node_trace
kmem_cache_alloc_trace
kmem_cache_cpu
kmem_cache_create
kmem_cache_create_usercopy
kmem_cache_debug
kmem_cache_debug_flags
kmem_cache_destroy
kmem_cache_double_free
kmem_cache_flags
kmem_cache_free
kmem_cache_free_bulk
kmem_cache_has_cpu_partial
kmem_cache_init
kmem_cache_init_late
kmem_cache_invalid_free
kmem_cache_node
kmem_cache_oob
kmem_cache_open
kmem_cache_order_objects
kmem_cache_release
kmem_cache_sanity_check
kmem_cache_shrink
kmem_cache_size
kmem_cache_zalloc
kmem_config
kmem_flags_convert
kmem_free
kmem_freepages
kmem_getpages
kmem_rcu_free
kmem_realloc
kmem_test
kmem_zalloc
kmem_zalloc_large
kmem_zone
kmem_zone_t
kmemdup
kmemdup_nul
kmemleak_alloc
kmemleak_alloc_percpu
kmemleak_alloc_phys
kmemleak_alloc_recursive
kmemleak_boot_config
kmemleak_clear
kmemleak_disable
kmemleak_do_cleanup
kmemleak_erase
kmemleak_free
kmemleak_free_part
kmemleak_free_part_phys
kmemleak_free_percpu
kmemleak_free_recursive
kmemleak_ignore
kmemleak_ignore_phys
kmemleak_init
kmemleak_late_init
kmemleak_load_module
kmemleak_no_scan
kmemleak_not_leak
kmemleak_not_leak_phys
kmemleak_object
kmemleak_open
kmemleak_scan
kmemleak_scan_area
kmemleak_scan_thread
kmemleak_seq_next
kmemleak_seq_show
kmemleak_seq_start
kmemleak_seq_stop
kmemleak_stop
kmemleak_test_exit
kmemleak_test_init
kmemleak_update_trace
kmemleak_vmalloc
kmemleak_warn
kmemleak_write

 

커널 분석에 필요한 플러그인을 추가로 설치합니다.

 

코드에 마우스를 올리면 커밋 내용을 볼 수 있습니다.

 

Linux kernel을 vscode에 연동하는 방법을 알아보았습니다.


Vim에 설정하는 방법을 추가합니다.

 

ctags, cscope

 

Linux kernel은 ctags와 cscope 데이터베이스 생성을 자동으로 도와줍니다. 다음과 같이 생성할 수 있습니다.

make ARCH=arm64 cscope tags

대략 10분 정도 기다리면 tag 파일이 생성됩니다.

 

생성된 cscope db 파일을 자동으로 vim에 로딩합니다.

set csprg=/usr/local/bin/cscope	(경로 확인하세요.)
set csto=0(숫자 0)
set cst
set nocsverb

if filereadable("./cscope.out")
   cs add cscope.out
else 
   cs add /usr/src/linux/cscope.out
endif
set csverb

" ctags 파일 등록
set tag=./tags;/

 

태그를 이용하여 함수로 이동 ('Ctrl + ]')과 되돌아오기 ('Ctrl+t')를 사용할 수 있습니다.

 

cscope 관련 명령어는 man sccope를 사용하여 확인하시길 바랍니다.

 

예시)

cs find s map_kernel

 


 

 

 

 

참고 자료

http://vim.wikia.com/wiki/Autoloading_Cscope_Database

www.youtube.com/watch?v=AywkIOje8ak

'개발' 카테고리의 다른 글

Wrapper 함수 생성  (0) 2020.10.23
ulimit 명령어와 Select, Poll 함수  (0) 2020.10.12
The file couldn’t be opened because you don’t have permission to view it.  (0) 2020.10.07
호출 규약  (0) 2020.09.22
PFX 인증서 생성  (0) 2020.06.19