VIM+Ctags Linux源码阅读神器

Vim+ctags可以方便的查阅linux内核源代码。ctags、cscope、 tlist好几个工具可以共用。
       先说ctags!其实,它只是用来生成一个tags文件,也就是把源代码中的对象找到、并记录下来,放到tags文件里。其他的工作就交给VIM来完成。
      “tags” 文件中包括这些对象的列表:

① 用#define定义的宏

② 枚举型变量的值

③ 函数的定义、原型和声明

④名字空间(namespace)

⑤ 类型定义(typedefs)

⑥变量(包括定义和声明)

⑦ 类(class)、结构(struct)、枚举类型(enum)和联合(union)类、结构和联合中成员变量或函数
  如何用VIM+ctags查看源码呢?
  首先,要安装ctags。
$ sudo apt-get install ctags
然后,进入到源码目录下:使用ctags -R命令生成tags文件。(参数-R表示,将该目录下所有的文件都包含在内)
/usr/src/linux-2.6.30$ sudo tags -R
也可以使用make tags命令,该命令只是将你选用的体系结构的文件包含到tags文件中。tags -R是将所有的体系结构都包含在内。
/usr/src/linux-2.6.30$ sudo make tags
(耐心等待一段时间,毕竟内核文件很大)

接下来,就可以使用命令查找需要的函数或结构体等!

一些常用的查找方法如下:
 1) 用命令行。在运行vim的时候加上"-t"参数,(这里一定要与生成tags文件时在同一目录下才可以)例如:
# vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。
 2) 在vim已打开的任意一个文件中,使vim处于命令模式下,使用":tag"命令,例如:
:tag foo_bar
如果要查找的是结构体的定义可以使用ts命令,同样是在命令行模式下,输入:ts  XX(要找的结构体)
这时vim会为你展现出许多个,用空格进行翻页,记下你要找的一个对应的数字,一直按空格键,直到提示你输入数字。输入对应的数字,回车就会跳转到你要查找的结构体定义处。
3) 最方便的方法是把光标移到变量名或函数名上,然后按下" Ctrl-]";用"Ctrl-o"退回原来的地方。用 Ctrl-]延着调用树向前跳转, 用Ctrl-t向回跳转(当然啦,这是建立你已经打开文件的基础之上喽!)
 4) 分割窗口
":tag"命令会将当前窗口的文件替换为包含新函数的文件。怎样才能同时查看两个文件呢?你可以使用 ":split"命令将窗口分开然后再用":tag"命令。vim 有个缩写命令可以做到这些:
:stag tagname
使用下面的命令可以分割当前窗口并跳转到光标下的标签:
Ctrl-w-]
如果指定了计数参数,新窗口将包含指定的那么多行。
有这些用法基本上就够用了,再多一些基本上就是VIM的灵活运用了。另外,如果这些还不能满足你的要求时,可以使用find和grep来帮忙。假如要找fork.c,就可以用在内核目录下输入:find  -name  fork.c
/usr/src/linux-2.6.30.5$ find -name fork.c
./kernel/fork.c

时间: 2024-10-03 14:55:49

VIM+Ctags Linux源码阅读神器的相关文章

linux源码阅读笔记 asm函数

在linux源码中经常遇到__asm__函数.它其实是函数asm的宏定义 #define __asm__ asm,asm函数让系统执行汇编语句. __asm__常常与__volatile__一起出现.__volatile__限制编译器不能对下面的汇编语句进行优化处理. 分析下面语句 __asm__("movb %3,%%dh\n\t" \ "movb %2,%%dl\n\t" \ "shll $16,%%edx\n\t" \ "movw

linux源码阅读笔记 fork函数

在阅读源码的过程中,发现找不到fork函数的定义.后来在linux/init/main.c中找到了这样一条语句 static inline _syscall0(int,fork) 原来这里就是fork函数的定义. 系统在linux/include/unistd.h有一个宏定义. #define _syscall0(type name)

linux源码阅读笔记 #define 语句的妙用

#define 语句用于宏定义,在c中,我们可以用其实现函数的功能.如下语句 #define test(a,b)  a>b?a:b 很显然,这是一个比较大小的语句.这里a,b相当于函数中的参数.but,如果我们想写一些复杂的语句怎么办.有办法,如下. #define test(a,b)  ({\ int c=0;\ a=b+c;}) but,如果我们想要返回值怎么办.有办法. #define test(a,b) ({\ int c=0;\ a=b+c;\ a;}) 四高一

linux源码阅读笔记 jmpi指令(转)

jmpi是段间跳转指令,用于x86实模式下, 如:BOOTSEG = 0x0c70 jmpi    4, #BOOTSEG 假如当前段CS==00h,那么执行此指令后将跳转到段CS==0x0c70,当然段cs的值也变为0x0c70,接下来将执行指令0x0c70:0004处的指令. 实模式下寻址是为了兼容8086处理器,8086是16位CPU(是ALU的数据宽度),20位地址总线可寻址1M内存空间.其寻址方式:段基址+偏移  的方式,段基址保存在CS.DS.ES等段寄存器内,相当于寻址的高16位,

linux源码阅读笔记 void 指针

void 指针的步长为1,而其他类型的指针的步长与其所定义的数据结构有关. example: 1 #include<stdio.h> 2 main() 3 { 4 int a[10]; 5 int *m=a; 6 void *n=(void *)a; 7 m++; 8 n++; 9 printf("%x\n%x\n%x",a,m,n);} 输出结果为: 69255b90 69255b94 69255b91

ubuntu下linux内核源码阅读工具和调试方法总结

http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一

如何准备阅读Linux源码

Linux 0.11虽然不是什么"珠穆朗玛峰",但它肯定还是"华山"或"泰山".虽然有路但你还是需要最基本的努力和花费一定的代价才能"攀登"上去. 1. PC兼容机硬件工作原理(比如8259A,8253, 8042,UART等硬件):2. Intel 32位 运行模式工作原理,寻址方式:3. 传统C语言:4. 一些Intel asm基础.5. 会使用Linux操作系统,懂得Linux系统的基本操作. 推荐参考书籍: =====

源码阅读的方法

小弟我入行不久,实打实的菜鸟,最近由于个人兴趣和工作需要,读了一些源码,感觉还不错,谨以此文做个小小的总结以达到抛砖引玉之效,如有错误和不足的地方希望各位补充. 感谢开源,让我这种并没有受过系统的软件开发训练的工程师也能学习到业界一流的代码,并通过源代码和一些顶尖的程序员零距离的对话.源码对于我这种经验算不上丰富的小白来说是恐怖的,但真正开始的时候却也是魅力无限的,当全身心地沉浸在代码中时,专注和兴奋度远大于听一次讲座或者看一本书,但如果方法不对则很有可能刚刚形成的勇气和兴趣会被无情地摧毁. 我

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index