内核源代码阅读工具介绍

摘要:
跳转在读取源代码的过程中,最常见的方法是跳转到指定函数的代码块。您可以在vim中输入::ls,以便查看已打开的文件列表。每个文件都有相应的编号。您可以使用以下命令跳转到编号为N的文件::bN文本搜索。此外,文本搜索也是阅读源代码过程中最常用的功能。让我们介绍如何在vim中更方便地使用文本搜索。现在进入内核目录(确保根目录中有标记文件)。

跳转

在源代码阅读过程中,最常用的就是跳转到一个指定的函数的代码块中。

  • 下面我们先介绍最常用的跳转功能

首选在内核源代码目录中,运行vim,然后输入:
:tj start_kernel

如果tags文件中只有一个标号为start_kernel的索引,就会直接跳转到这个start_kernel函数的定义中,如果有多个标号为 start_kernel的索引,vim会列出各个start_kernel和它所在的文件的对应关系,用户可以通过数字键来选择需要浏览的是哪一个文件中的start_kernel。

  • 跳转快捷键

每一次通过tj xxx来跳转不方便,把光标移动到某个函数上,

然后输入:
CTRL-]

假设光标所在的位置是setup_arch,这样就直接跳转到setup_arch函数中,注意tags文件中可能有多个标号为setup_arch的索引,CTRL-]总是跳转到索引中的第一个setup_arch函数。

这时可以输入:
g-CTRL-]

先按g,然后同时按下CTRL+],这样vim就会列举出所有的setup_arch函数和文件的对应列表,让您选择浏览。

  • 查看历史记录

现在,在vim中输入:
:tags

就可以列举出当前的历史浏览记录如下:
# 到 tag         从   行    在 文件/文本
1  1 start_kernel        1  init/main.c
2  8 setup_arch        541  init/main.c
  • 跳转回上一个函数

在初步浏览了setup_arch函数之后,您可能想要回到start_kernel函数,

于是在vim中输入:
CTRL+t

这样就跳转到了上一级tag了,此后,您可能又需要浏览setup_arch函数,此时您不需要输入setup_arch也不需要把光标移动到setup_arch,

只需要在vim输入:
:tag

就可以前进到setup_arch函数中,这是因为vim把最近的浏览历史保存在一个堆栈中,您可以在vim中输入tags来查看这个堆栈。

  • 局部变量的跳转

假设您现在正浏览setup_arch代码块,由于setup_arch函数很长,您遇到一个局部变量max_low_pfn,此时您想跳转到这个变量的定义的地方,使用CTRL-]是不行的,因为CTRL-]是根据ctags文件中的索引来跳转的,而这个索引文件只会保存全局的变量函数等信息,试想如果局部变量也保存索引的话,那么像i,j,k这一类的变量的索引就会非常的多。此时您可以把光标移动到max_low_pfn的下面,

然后在vim中输入:
gd

此时就会跳转到setup_arch函数中的max_low_pfn定义的地方(记住Goto Definition,就记住了这个命令)。


文件跳转

Vim还能记住您浏览文件的历史记录,这样就可以方便的在各个文件直接进行跳转。您可以在vim中输入:

:ls

这样您就可以看到您曾经打开过的文件列表,每一个文件都对应一个编号,您可以通过下面的命令跳转到编号为N的文件中:

:b N

文本搜索

另外,在源代码阅读过程中,文本搜索也是最常用的功能,下面我们来介绍如何在vim中更加方便的使用文本搜索。

假设您需要在init/目录中搜索包含command_line的文件

可以在vim中输入:
:grep -r "command_line" init/ --include=*.c

--include=*.c的作用是规定只在.c的文件中搜索。之后在vim中输入:

:cw

这时vim被分成两个窗口,其中下面的显示搜索的结果,

您可以在vim中输入:
CTRL-w

在这两个窗口之间切换(您可以使用窗口-window来记住它。)。

现在把光标移动到下面的窗口,通过h,j,k,l移动光标,之后按下回车,光标下面那一行的文件就出现在上面的窗口了。


taglist

有时候,打开一个文件,我们希望能够像Virtual C++那样,把这个文件中的所有函数,宏等信息按照树形结构列举出来,同时可以方便的选择浏览。在vim中,这需要借助taglist插件。到http://vim-taglist.sourceforge.net/下载最新的taglist插件,解压缩后得到两个目录,plugin和doc。您可以根据Installation的指导安装。

对于ubuntu用户,把这两个目录拷贝到/etc/vim目录下,然后在vim中输入:
:helptags /etc/vim/doc
这样是为doc中的帮助文件生成索引,以后可以在vim中通过:
:help xxx
来查看taglist的xxx的帮助文件的内容。

现在进入内核目录下(确保根目录下已经有tags文件。),然后打开某个.c文件,

此时在vim中输入:
:TlistOpen

这样就在左边出现一个窗口,以树形结构显示当前的.c文件中的宏,全局变量以及函数。同样您可以通过输入:CTRL-w 在这两个窗口之间切换。当您把光标移动到Taglist的窗口之后,可以移动光标到想要浏览的函数名上,然后按下回车,此时您就可以在左边的窗口浏览这个函数的代码了。

如果您想关闭Taglist的窗口,可以输入:
:TlistClose
或者把光标移动到Taglist的窗口,输入:
:q

在Virtual C++中,我们可以折叠或者展开树形列表中的函数、变量、宏,vim也是可以的。把光标移动到Taglist的窗口中,如果您要折叠宏的树形列表,确保光标位于宏的树形列表中的任何位置,

输入:
zc
如果要展开,就输入:
zo

您可以通过close和open来记住他们。

当您打开另外一个.c文件时,前面的那个文件的taglist和新文件的taglist都会出现在Taglist的窗口中,这样随着打开的文件的增多,taglist也会越来越多,浏览的时候很不方便,为了保证Taglist的窗口中只出现当前文件的tags,

可以在vimrc文件中加入:
let Tlist_Show_One_File = 1  "不同时显示多个文件的tag,只显示当前文件的

到此为止,您已经能够很方便的浏览源代码了,只要您坚持使用,您将会逐渐掌握更多的vim技能。

参考资料:vim中文文档 http://vcd.gro.clinux.org/doc/usr_toc.html

免责声明:文章转载自《内核源代码阅读工具介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇GatewayWorker与ThinkPHP等框架结合使用SpringSession和Redis解决分布式Session共享问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vim配置Nginx语法高亮

在日常配置 Nginx 的时候,通常都是在服务器上使用 vim 来操作,但是 vim 操作 nginx.conf 的时候没有语法高亮和格式化。 有时候 nginx.conf 的配置层级很深,这样就会导致 nginx.conf 的缩进格式十分混乱。 其实 Nginx 的安装包中自带了 Vim 的插件,可以让 Vim 支持 nginx.conf 语法。 一般...

Vim:Vim入门级配置

转:https://vimjc.com/vimrc-config.html Vim配置文件.vimrc Vim编辑器相关的所有功能开关都可以通过.vimrc文件进行设置。 .vimrc配置文件分系统配置和用户配置两种。 系统vimrc配置文件存放在Vim的安装目录,默认路径为/usr/share/vim/.vimrc。可以使用命令echo $VIM来确定V...

vi 分屏 --(visual 可视模式)

vi 文本编辑器 vim 支持文本标记辨别,支持正则表达式的搜索、多文件编辑、块复制等等 三种命令模式: command 命令模式输入命令 insert 插入模式 插入文本 visual 可视模式,可视化高亮并选定文本 vim 分屏就是 visual 模式。 vim 编辑文件时分屏 : vim -O txt1 txt2 垂直分屏 vim -o txt1...

记一次阿里云服务器中部署egg遇到的问题 (docker vim)

------------恢复内容开始------------ 1.下载好egg脚手架, 在package.json 同目录 添加 Dockerfile 2.编写Dockerfile # 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像 FROM node # 设置时区 # RUN apk --update add tzdata...

vimdiff的常用命令

★ 跳转到下一个diff点: 请使用 ]c 命令★ 跳转到前一个diff点: 请使用 [c命令如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第  三个差异点。★ 文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,...

oracle执行计划详解

  一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具  —>  首选项 —>   窗口类型  —>  计划窗口  —>  根据需要配置...