免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6503 | 回复: 14
打印 上一主题 下一主题

[内核入门] 浅谈内核源码研究方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-20 14:39 |只看该作者 |倒序浏览
本帖最后由 comba_sellie 于 2014-08-12 19:12 编辑

介绍自己研究源码中所使用的工具及方法,希望对大家有帮助。

1.选择合适的源码阅读工具
我选择的工具是Source Insight-v3.50.0066。
Source Insight这个工具应该不用介绍吧,Windows平台上公认最好的源码阅读工具(不确定是不是公认 )。使用方法就不说了,大家可以问百度后再自己实操。
主要使用到以下一些功能:
1.reference trees
2.call trees
3.smart rename
4.macro
5.Edit condition
6.强大的搜索功能

下面是source insight设置的效果图(背景设置成灰色,眼睛不易疲劳,VC-style,大家可以按自己喜好设置)

所用的配置文件(将后缀名.gz去掉)
GLOBAL.CF3.gz (129.85 KB, 下载次数: 152)

2.新建工程并添加内核源码
如果把内核所有文件添加进来,阅读过程中会遇到许多同名的函数(因为kernel支持不同架构,同名函数在不同架构下的实现),此时寻找该函数实现就会变得困难,
而且由于添加所有文件将使工程变得臃肿,搜索速度变慢,影响阅读效率。这里我对内核的头文件及源文件进行了筛选,只添加那些确实编译进内核的文件。
具体原理是解析内核编译过程中生成的*.cmd文件
操作步骤:
1)下载script.zip script.zip (962 Bytes, 下载次数: 249)
2)过滤内核编译文件
编译内核(如果编译过了,这步可忽略),确保生成*.cmd文件。
解压出两个shell脚本,将其放置在内核源码根目录下运行。
运行完后会在内核源码根目录下生成两个文件和一个文件夹。
其中kernel-header.txt kernel-src.txt是内核编译用到的头文件及源文件列表
other-file-header存放的是编译script下的源文件时用到的头文件,头文件来源: /usr/include及gcc编译器目录下的头文件
将这两个文件及一个文件夹拷贝至Source Insight内核工程目录下(这里要注意,创建Source Insight内核工程时需要将目录设置为内核源码目录,否则后面操作会失败)
3)添加文件
打开Source Insight的内核工程
打开Project->Add and Remove Project Files...->Add from list...
选择kernel-src.txt
选择kernel-header.txt
选择other-file-header目录
->Add All 将other-file-header目录的头文件添加进工程

3.开始遨游内核源码之旅
从head.S第一条指令到start_kernel,每个架构实现都不一样,这里就不细说。
这里主要说明一下start_kernel()->rest_init()->kernel_init()->do_basic_setup()->do_initcalls() 这个函数的重要性
该函数功能: 运行内核各个组件的初始化函数。(实现原理可参考《Linux内核协议栈源码解析V0.1.pdf》中的Link Scripts知识)
用下面指令过滤后即为do_initcalls的执行流程
readelf -s -W vmlinux|grep initcall|sort -k 2
可以选择自己感兴趣的内核组件开始研究。
阅读过程中会遇到许多函数指针调用如:
/* socket.c中socket系统调用代码 */
err = pf->create(net, sock, protocol);
此时就不能一眼看出到底调用的那个函数,一般函数指针会在初始化阶段赋值,此时就得去阅读初始化代码并将其转换成Visio图。
Visio特别适合画数据结构关系图,函数流程图,有图在手再也不用烦恼函数指针不知指向何处了,这样即使过很久后二次阅读也能很快理解代码实现。
下图是我研究过程中画的Visio图
network.zip (3.05 MB, 下载次数: 1273)
根文件系统的挂载过程.zip (37.25 KB, 下载次数: 153)

就扯这么多。

第二次编辑:
更新了脚本
添加了内核condition解析代码
添加了uboot相关的内容
linux-parse.rar (10.58 KB, 下载次数: 1513)

评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 赞一个!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2013-01-20 15:12 |只看该作者
唔。。。。买不起正版的Source Insight

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2013-01-20 21:57 |只看该作者
回复 1# comba_sellie
感谢 LZ 分享


   

论坛徽章:
0
4 [报告]
发表于 2013-01-21 21:57 |只看该作者
  感谢分享,那个提取源文件的方法不错。

  不知道有没有方法能够把只有包含那些确定包含的编译选项宏所定义的代码提取进来呢,内核里那么多条件编译。。。

论坛徽章:
0
5 [报告]
发表于 2013-01-21 22:56 |只看该作者
回复 4# luoyan_xy
有写过一个Source Insight的宏,但是还不完善,只能解析autoconf.h中
#define CONFIG_XX 1
#define CONFIG_XX 0
两种情况

   

论坛徽章:
0
6 [报告]
发表于 2013-01-22 10:56 |只看该作者
回复 2# evilhacker


    谁用正版?序列号一搜一大把。附我的SI:

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2013-01-22 13:02 |只看该作者
看情况吧,有些公司里,被IT部门查到用盗版就high了。

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
8 [报告]
发表于 2013-01-22 16:17 |只看该作者
有公司还被发warning letter!!!

论坛徽章:
0
9 [报告]
发表于 2014-08-12 19:13 |只看该作者
擦 重新编辑后居然不重新排列 只好自己来了

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
10 [报告]
发表于 2014-08-12 21:38 |只看该作者
回复 1# comba_sellie

很好,针对内核代码的阅读问题,网上确定没有非常好的工具,目前来说只能SI最适合了。但毕竟内核有大量的指针引用、重名函数、宏拼接。因此我自己想打算自己做一个内核专用的分析工具出来。现在正在做源码解释部份,已经在github上注册项目了,目前因为还不成熟,先不把项目公开。
稍微成熟,希望你能参与进来。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP