Linux kernel分析前的准备
分析工具
“欲善其事,先利其器”。Linux内核的代码量非常大,如果没有一个好的察看分析工具,那将是一件非常繁琐的事情。
Vim+cscope
cscope,如果你知道ctags,那么它是一个比ctags更强大的工具,如果你不知道ctags,也没关系,cscope使你可以在一大堆的代码中进行轻松查找函数、宏、结构体等标示符定义处、使用点,并进行跳转。
安装
cscope在Fedora和Ubuntu的源里都有,可以直接yum或apt-get。
Fedora下cscope安装好后就直接可以与Vim一起使用,但Ubuntu下安装好cscope后,还要在/ect/vim/vimrc文件的最后添加如下内容:
if has("cscope")
set csprg=/usr/bin/cscope
set csto=
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
这使Vim可以自动加载cscope生成的索引文件。要获取更多信息,在Vim中输入“:help cscope"也可以得到。
使用
首先在源码目录下用cscope生成cscope索引文件,
cscope -bqR
当前目录下会生成cscope.out,cscope.in.out和cscope.po.out三个索引文件。
其中参数含义如下:
-b 只生成索引文件,并不进入cscope交互界面;
-q 生成cscope.in.out和cscope.po.out两个文件,加快查找;
-R 遍历子目录。
我只用到这三个命令,如果想了解更多,可以察看help或man文档。
现在就可以用了,如果你不想给自己找一些不必要的麻烦,你应该在有cscope.out,cscope.in.out和cscope.po.out的目录直接运行Vim:
vim .(或者vim ./)
在这里再介绍一个Vim插件NERD tree,此插件可以使vim中的目录更好看,效果图如下:
在Vim中,cscope使用最多的命令是find,可以简写为f。想要获取Vim中cscope的其他命令,可以输入:
:cs help
来获取,结果如下:
cscope 命令:
我经常使用的有:
c 查找一个函数被那个函数调用,此命令仅限于函数对函数。我一般会用s来代替c,因为可能结构体中也有使用了该函数,那么c命令是查不到的,而s就可以。
f 查找一个文件。
g 查找某个函数的定义处。
s 查找一个标示符,结果会包括c、g命令的结果和其他地方使用了此标示符的地方(标示符不同于字符串,它是独立存在的,并不是一个字符串的一部分)。
t 此命令是最耗时的命令,它在代码中查找所有含有此字符串的地方。
最后当你找到你要找的项,输入数字标号就会跳转到你要着的那一项。
实例
代码:Linux内核代码,版本3.5.4
具体函数为fs/btrfs/acl.c文件中的第一个函数btrfs_get_acl。
查找此函数的定义处
在Vim中输入:
查找此函数的定义处,显示如下:
我们发现有两处,但仔细看看,第二项并不是你要找的,第一项才是你要找的。
查找此函数被那些函数调用
显示如下:
其中上面的内容简单介绍一下,1、2、3是标号;后面跟着的数字是在文件中的行号;后面是文件名;双尖括号里的是调用btrfs_get_acl函数的函数;下面的一行是调用此函数的内容,有时,你可以从文件名和内容猜测是不是你要着的东西。
查找此标示符在那些地方出现
从上面的查找内容可以看出,除了刚刚上面两种查找到的结果,其中还有一些其他的项。
其中第一项是此函数的声明;第二项和第八项是查找定义处时就有的;第三项到第七项是其他地方调用到地方,这些地方是结构体对它调用。
想更好的使用,还需要你去慢慢练习
分析方法
方法有多种,看你怎么用!
如果能找到资料,那我们从资料入手,这是最好的办法;
如果我们只能找到一些零散的资料,这些资料中并没有对代码的分析,只是对这个软件进行了一些功能介绍,我们可以从这些功能入手,从这些功能的每一个点入手,找关键字,然后将这些功能定位到代码中,接下来再从代码开始分析;
但有时没有任何的资料,那就要从代码中来,你可以先从代码的入口开始,一般是main函数,但Linux内核代码太大,如果这样分析的话,我们面对的是整个内核代码,这将是一个浩大的工程,你会望而却步的,所以,你要从点入手,内核代码非常规程,模块化特别好,你可以从单个模块入手,然后在这个模块中寻找更小的功能点开始。
资料搜索
首选google,其次百度。搜索是可以将想要搜索的信息精简,放小范围。
搜索多个结果进行对比。
做笔记,我喜欢用MediaWiki作为我的文档管理器,MediaWiki可以很好的对你的文档各个版本进行记录。你可以回到N天前你修改的文档。
经验积累
Linux内核中用到了许多经典的编程思想,我们会经常见到不懂的点,这些点我们可以从网上基本上都能找到,但是,有些点,我们看一遍之后几天又忘了,这时做笔记就尤为重要。
以上都是我的经验之谈,更多还需要自己实践。
Linux kernel分析前的准备的更多相关文章
- linux heads分析(转)
内核默认的运行地址为PHY_OFFSET+0x8000,即物理地址开始后的0x8000字节处,前面是留给参数用的.参数以atag方式存储,默认放在0x100偏移位置. http://blog.chin ...
- arm linux kernel 从入口到start_kernel 的代码分析
参考资料: <ARM体系结构与编程> <嵌入式Linux应用开发完全手册> Linux_Memory_Address_Mapping http://www.chinaunix. ...
- linux kernel make构建分析
前言 之前对uboot的构建进行了分析,现在再对linux kernel的构建进行分析.几年前的确也分析过,但是只是停留在笔记层面,没有转为文章,这次下定决定来完善它. 环境 同样,采用的还是zynq ...
- Linux Kernel文件系统写I/O流程代码分析(一)
Linux Kernel文件系统写I/O流程代码分析(一) 在Linux VFS机制简析(二)这篇博客上介绍了struct address_space_operations里底层文件系统需要实现的操作 ...
- Linux kernel的中断子系统之(七):GIC代码分析
返回目录:<ARM-Linux中断系统>. 总结: 原文地址:<linux kernel的中断子系统之(七):GIC代码分析> 参考代码:http://elixir.free- ...
- Linux性能分析的前60000毫秒【转】
Linux性能分析的前60000毫秒 为了解决性能问题,你登入了一台Linux服务器,在最开始的一分钟内需要查看什么? 在Netflix我们有一个庞大的EC2 Linux集群,还有非常多的性能分析工具 ...
- linux kernel内存映射实例分析
作者:JHJ(jianghuijun211@gmail.com)日期:2012/08/24 欢迎转载,请注明出处 引子 现在android智能手机市场异常火热,硬件升级非常迅猛,arm cortex ...
- Linux kernel kfifo分析【转】
转自:https://zohead.com/archives/linux-kernel-kfifo/ 本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/li ...
- Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback
Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback 上一篇# Linux Kernel文件系统写I/O流程代码分析(一),我们看到Buffered IO,写操作写入到 ...
随机推荐
- Cisco IOS版本命名规则
首先说说IOS的运行平台,c2500.c2600.c4500.c2950代表运行此IOS的硬件平台,例如:C2500指2500系列路由器. 其次,看看IOS的版本,IOS有主版本号:11.0.11.1 ...
- Vim 替换命令
一,":substitute"的使用 :substitute 命令可以对一个指定范围的区域执行替换操作,可以简写为:s ,它的通用形式如下: :[range]substitute/ ...
- php一维数组的创建
php一维数组的创建 (1)通过array函数声明数组 使用array 函数定义数组,该函数返回通过所接受接收的参数建立的数组.array 函数使用的格式如下. $arry_name = array( ...
- NodeJS Cross domain
跨域问题主要在header上下功夫 首先提供一个w3c的header定义 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html 再提供一个网友提 ...
- css 网站素装 追忆过去
素装代码,以表哀悼等.以下为全站CSS代码. html { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: ...
- Spring MVC的工作原理和机制
Spring MVC的工作原理和机制 参考: springMVC 的工作原理和机制 - 孤鸿子 - 博客园https://www.cnblogs.com/zbf1214/p/5265117.html ...
- 分享知识-快乐自己:Java中各种集合特点
Java中各种集合特点: Collection[单列集合]: List(有序,可重复): ArrayList: 底层数据结构是数组,查询快,增删慢.线程不安全,效率高. Vector: 底层数据结构是 ...
- Java集合类--->入门上篇
最近我又在研究Java语言,这是第五次还是第六次学习Java的集合类,你也许会惊讶为什么这么多次?哈哈,因为之前的我没有记录下来,忘记了,当然最主要还是觉得自己毅力不够,没有坚持.那么,这次我将换一种 ...
- mysql连接超时问题
前几天使用个脚本不停的查看redis队列中的事件.如果有则把事件取出来,然后进行一些数据库操作. 后来发现,每天的第一次有事件时都会到导致,找不到数据. 后来定位到问题,是mysql在连接长时间无活动 ...
- codeforces 655C C. Enduring Exodus(二分)
题目链接: C. Enduring Exodus time limit per test 2 seconds memory limit per test 256 megabytes input sta ...