Linux公社论坛

 找回密码
 注册
查看: 170|回复: 0

[教程分享] 在vim上构建ARM Linux内核源码分析环境(下)

[复制链接]

2

主题

0

听众

5

积分

新手上路

Rank: 1

CoolLoser 发表于 2020-1-21 11:24:36 |显示全部楼层
3 vim插件下载即环境配置
我们已经创建了分析内核源代码的符号数据库。向vim编辑器直接输入ctags命令和cscope命令,就能构建可分析代码的环境,但如果不熟悉这些命令,那距完全掌握还差一步。为了弥补这些不足,我们需要构建更加直观的环境。如果将开放源码vim和plugin进行组合,与ctags和cscope联动,就可以构建更漂亮的个性化环境分析工具。
3.1 下载vim插件
需要三个插件,分别是:Source Explorer,NERD Tree,Tag List。我们可以在www.vim.org网站下载,下面是具体下载步骤:
  • 下载Source Explorer
    进入网站,点击右侧的Scripts

然后点击Browse all

然后在页面的底部搜索Source Explorer

如图,在搜索结果中选择Source Explorer (SrcExpl)

下载最新版本即可

2. 下载NERD Tree
    用同样的方法搜索NERD Tree,在结果中选择The NERD tree,下载最新版即可,这里不再赘述

3. 下载Tag List
    用同样的方法搜索Taglist,在结果中选择taglist.vim,下载最新版即可,这里不再赘述
3.2 vim+plugin的环境构建
安装已下载好的三个插件并设置vim环境。vim的插件要位于.vim/plugin目录,如果没有需要自己创建,安装的步骤及命令如下:
mkdir .vim
cp SrcExpl-6.0.zip .vim
cp NERD_tree.zip .vim
cp taglist_46.zip .vim
cd .vim
unzip SrcExpl-6.0.zip
unzip NERD_tree.zip
unzip taglist_46.zip
执行以上命令之后,插件就安装好了。接下来设置vim环境。
3.3 vim环境设置
设置vim环境,需要修改宿主目录下的.vimrc文件(如果没有该文件,需要自己创建),设置的目的是为了使已安装的插件和ctags、cscope数据库能联动,所需信息有ctags和cscope数据库文件的位置、ctags和cscope程序的安装位置,可以使用下列命令查看其位置:
whereis ctags
输出:
ctags: /usr/bin/ctags /usr/share/man/man1/ctags.1.gz
whereis cscope
输出:
cscope: /usr/bin/cscope /usr/share/cscope /usr/share/man/man1/cscope.1.gz
确认了ctags和cscope的位置之后,我们就可以修改.vimrc文件了,修改的内容如下:
"-------------------------------------------------------------------------------------------------------"
"vim环境配置
"-------------------------------------------------------------------------------------------------------"
    set nu                                                                  "line number
    set ai                                                                  "auto indent
    set ts=4                                                                "tab size
    set bg=dark                                                             "backgroud color

"-------------------------------------------------------------------------------------------------------"
"ctags database path设置
"-------------------------------------------------------------------------------------------------------"
    set tags=/home/CoolLoser/src/linux-2..6.30.4/tags                       "ctags DB路径

"-------------------------------------------------------------------------------------------------------"
"cscope database path设置
"-------------------------------------------------------------------------------------------------------"
    set csprg=/usr/bin/cscope                                               "cscope位置
    set csto=0                                                              "cscope DB search first
    set cst                                                                 "cscope DB tag DB search
    set nocsverb                                                            "verbose off

    "cscope DB 位置设置,使用绝对路径
    cs add /home/CoolLoser/src/linux-2..6.30.4/cscope.out /home/CoolLoser/src/linux-2..6.30.4
    set csverb                                                              "verbose off

"-------------------------------------------------------------------------------------------------------"
"Tag List环境设置
"-------------------------------------------------------------------------------------------------------"
    filetype on                                                             "vim filetype on
    nmap <F7> :TlistToggle<CR>                                              "F7 Key = Tag List Toggling
    let Tlist_Ctags_Cmd = "/usr/bin/ctags"                                  "ctags程序位置
    let Tlist_Inc_Winwidth = 0                                              "window width change off
    let Tlist_Exit_OnlyWindow = 0                                           "tag/file完成选择时taglist
                                                                            "window close = off
    let Tlist_Auto_Open = 0                                                 "vim开始时window open = off
    let Tlist_Use_Right_Window = 1                                          "vim开始时window open = off

"-------------------------------------------------------------------------------------------------------"
"Source Explorer环境设置
"-------------------------------------------------------------------------------------------------------"
    nmap <F8> :SrcExplToggle<CR>                                            "F8 Key = SrcExpl Toggling
    nmap <C-H> <C-W>h                                                       "向左侧窗口移动
    nmap <C-J> <C-W>j                                                       "向下端(preview)窗口移动
    nmap <C-K> <C-W>k                                                       "向上端窗口移动
    nmap <C-L> <C-W>l                                                       "向右侧窗口移动

    let g:SrcExpl_winHeight = 8                                             "指定SrcExpl Windows高度
    let g:SrcExpl_refreshTime = 100                                         "refreshing time = 100ms
    let g:SrcExpl_jumpkey = "<ENTER>"                                       "跳转(jump)至相应定义definition
    let g:SrcExpl_gobackkey = "<SPACE>"                                     "back
    let g:SrcExpl_isUpdateTags = 0                                          "tag file update = off

"-------------------------------------------------------------------------------------------------------"
"NERD Tree环境设置
"-------------------------------------------------------------------------------------------------------"
    let NERDTreeWinPos = "left"                                             "NERD Tree位置=左侧
    nmap <F9> :NERDTreeToggle<CR>                                           "F9 Key = NERD Tree Toggling
上面可以看到,F7、F8、F9三个按键就是Tag List、Source Explorer、NERD Tree的切换按键。
3.4 查看源码分析环境工具
完成上面的所有操作之后,我们就可以来看一下分析工具了,在内核源码根目录中执行vim命令,然后依次按下F7,F8,F9按键,就会看到Tag List、Source Explorer、NERD Tree的窗口了,如图所示:
在NERD Tree窗口中移动光标至./init目录后按Enter键,则显示./init目录所在文件列表。将光标移动到./init/main.c文件,按Enter键打开main.c文件,如图所示:
利用Ctrl+h(移动到左侧窗口)、Ctrl+j(移动到下端窗口)、Ctrl+k(移动到上端窗口)、Ctrl+l(移动到右侧窗口)键移动到各个窗口,如果各窗口移动不顺利,请确认.vimrc文件配置是否正确。
将光标移动到Tag List窗口之后,查找start_kernel符号:进入vim的ex模式,在下端窗口输入/start_kernel,Tag List窗口的光标会移动到start_kernel符号,若按Enter键,则在代码文件窗口中显示定义start_kernel的位置,如图:
在代码中移动光标并放在函数或变量上时,下方的Source Explorer窗口显示定义相应符号的位置。例如,将光标移动到start_kernel后,Source Explorer窗口显示start_kernel符号定义文件。
移动到下端窗口(Ctrl+j)后,选择列表中的一项(Enter键),就会在代码窗口中显示该文件。例如此时在下端的Source Explorer窗口选择第2个文件,可以看到如下画面,说明在./include/linux/start_kernel.h文件中声明了start_kernel函数。
像这样,将光标移动到要找的符号,则Source Explorer窗口就显示与符号相关的文件列表,若光标移动到Source Explorer窗口并选择文件,就会在代码窗口显示相应的代码。
我们可以一直前进朝一个方向查找符号,但是有时候需要回到上一个状态,此时按空格键即可回到之前的状态。
以上就是使用vim插件和ctags数据库联动构建的分析环境。这种分析环境对内核代码分析来讲已经足够了,但对内核进行实际分析时,会发现还有仅用ctags无法完成的部分。由于cscope数据库我们也完成了环境设置,因此我们可以用cscope来进行。
在NERD Tree窗口中选择并打开./kernel/kthread.c文件,在代码窗口将光标移动到247行的kthread_create_list符号,这时在Source Explorer窗口显示Definition Not Found,即无法查找到kthread_create_list符号。
对于这种情况,可通过cscope指令得到与kthread_create_list相关的文件列表。在vim的ex模式输入如下命令:
cs find s kthread_create_list
此时,就显示了搜索到的使用kthread_create_list符号的文件,然后输入搜索结果左侧的编号,就可跳转到响应的位置,如图:
因此,使用cscope可以弥补ctags未能搜索到的部分。

您需要登录后才可以回帖 登录 | 注册

关注Linux公社官方微信,免费领取邀请码。

手机版|Linux公社(LinuxIDC.com)旗下网站【www.linuxidc.net】

GMT+8, 2020-2-24 07:01 , Processed in 1.058061 second(s), 13 queries , Wincache On.

Powered by Discuz! X 3.2

© 2010-2016 Comsenz Inc.

回顶部