Linux下内核源码阅读方法 (vim+ctags+taglist+cscope)

因为长期受 Windows 下 source insight 查看内核源码的困扰(Windows下文件大小写问题、无法完全 synchronize symbol、以及全局查询较慢),因此另寻出处,找到本文的解决方案。本文的 OS 环境为 SLES15。

 

一、安装&环境准备

安装 vim(通过 vim 查看代码文件)

-

Bash 代码

1zypper in vim

 

安装 ctags(ctags 生成代码文件中各种数据类型的索引文件,每个标识符的定义、所在文件中的行位置、所在文件的路径等信息称为 tag)
下载地址:http://ctags.sourceforge.net/,本文档下载最新版本:ctags-5.8.tar.gz

-

Bash 代码

1tar -zxvf ctags-5.8.tar.gz
2cd ctags-5.8/
3./configure
4make
5./mkinstalldirs
6make install
7检查是否安装成功:
8whereis  ctags

 

安装 Taglist(Taglist 需要 ctags 的支持,该安装包可以实现查看 symbol 列表的功能)
下载地址:https://sourceforge.net/projects/vim-taglist/files/vim-taglist/,本文档下载最新版本:taglist_46.zip

-

Bash 代码

1cd ~
2mkdir .vim
3unzip taglist_46.zip -d ~/.vim
4ls ~/.vim

配置帮助文件到vim

-

Bash 代码

1vim
2:helptags ~/.vim/doc

将 Taglist 与 ctags 关联,以及Taglist相关配置

-

Bash 代码

1vi ~/.vim/plugin/taglist.vim

在 "if !exists('loaded_taglist')" 之上添加如下内容:

-

Bash 代码

1"默认显示行号
2set nu
3"将 Taglist 与 ctags 关联
4let Tlist_Ctags_Cmd="/usr/local/bin/ctags"

然后在文件末尾添加如下配置:

-

Bash 代码

1"语法高亮
2syntax on
3 
4"设置taglist宽度(默认30),可以根据自己的环境进行设置
5let Tlist_WinWidth=50
6 
7"tagList窗口是最后一个窗口,则退出Vim
8let Tlist_Exit_OnlyWindow=1


安装 cscope(可以认为该工具为 ctags 的加强版,具有强大的查询 symbol 功能)
下载:https://software.opensuse.org/package/cscope,本文档下载版本为:cscope-15.8b-2.8.x86_64.rpm
也可以去官网下载:https://sourceforge.net/projects/cscope/files/

-

Bash 代码

1rpm -ivh cscope-15.8b-2.8.x86_64.rpm

 

二、进入源码目录,构建索引

构建 ctags 索引

-

Bash 代码

1cd 源码目录
2ctags -R

此时源码目录下生成如下文件:


 

 

构建 cscope 索引

-

Bash 代码

1cd 源码目录
2cscope -Rbq

此时源码目录生成如下文件:


.out 是最基本的符号索引,后两个文件是 -q 参数生成的,可一加快 cscope 的索引速度

cscope 命令参数含义如下:

-

Bash 代码

1-R: 在生成索引文件时,搜索子目录树中的代码
2-b: 只生成索引文件,不进入cscope的界面
3-k: 在生成索引文件时,不搜索/usr/include目录
4-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
5-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用"-",表示由标准输入获得文件列表。
6-I dir: 在-I选项指出的目录中查找头文件
7-u: 扫描所有文件,重新生成交叉索引文件
8-C: 在搜索时忽略大小写
9-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了

 

三、实操

进入源码目录,vim 某个文件

-

Bash 代码

1vim drivers/usb/host/xhci-ring.c

 

此时默认就能够使用 ctags 的功能,常见用法的快捷键如下(:help tags【打开 ctags 命令介绍】):

Ctrl + ]【跳到光标所在 symbol 的定义处】
Ctrl + t【返回到上一次光标停留处】
:ta le64_to_cpu【跳到 le64_to_cpu 定义处】
:ts le64_to_cpu
g + ctrl + ]【列出光标所在 symbol 的所有定义】


:tn【跳到在上一步列出 symbol 中 的下一个】
:tp【跳到在上一步列出 symbol 中 的上一个】
:tj le64_to_cpu【如果只有一个定义直接跳入,如果有多个让用户选择】

 

如果有需要可以打开 Taglist 显示当前文件的所有 symbol

-

Bash 代码

1:Tlist



用法:
Ctrl + w + w:在两个窗口之间切换
左边窗口上下移动光标,回车,右边窗口会跳到光标所指 symbol
切换到左窗口,F1 显示帮助(标红的为常用功能):
<enter> : Jump to tag definition 
o : Jump to tag definition in new window
p : Preview the tag definition 
<space> : Display tag prototype 
u : Update tag list 
s : Select sort field 
d : Remove file from taglist 
x : Zoom-out/Zoom-in taglist window 
+ : Open a fold 
- : Close a fold 
* : Open all folds 
= : Close all folds 
[[ : Move to the start of previous file 
]] : Move to the start of next file 
q : Close the taglist window 
<F1> : Remove help text 
 

命令行模式下添加 cscope 索引:


此时可以使用 cscope 相关命令了,cscope 相关命令如下:

a:找到符号的赋值

s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件

 

举例(查找哪些函数调用了指定函数):

-

Bash 代码

1:cs f c handle_cmd_completiont
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值