知识从哪里来
1. 永远不要忘记的三大帮助命令
XXX -h(xxx –help)man -a XXX
info XXX
2. 如何安装帮助文档
$ sudo synaptic 界面出来后,在“组别”->“文档”选取你要的文档进行安装或$ apt-cache search Documentation | grep XXX 搜索需要的文档进行安装
3. 从软件/工具的官方网站阅读/下载文档
4. 从irc获取帮助
irc.freenode.net
5. 从邮件列表获取帮助
mailist http://lkml.org/ http://marc.info/
6. 发行版社区文档或社区
https://help.ubuntu.com/community/http://wiki.ubuntu.org.cn/
http://www.fedorachina.cn/forum/index.php
……
7. 利用google搜索文档或阅读他人文章
8. 利用google搜索lkml
http://www.google.cn/advanced_search?hl=zh-CN 网域那里填上lkml.org9. 获取内核文档
源码本身源码中的注释
内核源码附带的文档 Documentation
相关的教科书
论文 免费论文引擎 http://citeseerx.ist.psu.edu/
内核子系统的官方网站
获取内核源码目录Documentation/DocBook/ 下已经编译好的书籍
找到最新版本的文档
$ apt-cache search linux-doc
安装最新的文档
$ sudo apt-get install linux-doc-2.6.24
阅读Documentation/DocBook/ 下已经编译好的书籍(html格式)
$ firefox /usr/share/doc/linux-doc-2.6.24/html/index.html
注,其实可以把内核源码中的文档自己编译成html格式。需要用apt安装某个工具,步骤忘了,以后补上。
10. 买书
11. 书籍最后面的参考书目
12. 文章末尾的参考文献
13. 电子书搜索网站
emule: 只要知道书名,windows下用emule基本可以找到所有的英文版电子书。但在linux不行,可能是我的设置问题。
http://rapidshare.com/index.html
http://www.netbks.com/
14. gnu文档。
权威,全面
http://www.gnu.org/manual/manual.html
内核学习曲线
1.只读书不看源码
参考书籍:Linux Kernel Development2.参考源码读书(读书为主)
参考书籍:understanding the linux kernel3.参考书读源码(看源码为主)
参考书籍:情景分析4.只看源码不/少读书(提交补丁为主)
参考:lkml,main-tree, mm-treelinux内核分析方法:
按分析的对象分:
1.代码: 分析的对象是源代码
2.数据: 分析的对象是内核运行时产生的数据
按观察对象的状态分:
1.静态: 观察的目标对象是静止不动的
2.动态: 观察的目标对象是动态变化的
所以综合地看,分析方法的种类有:
1.静态代码: 最原始的方式,阅读源代码
2.动态代码: 利用某些工具或手段,动态分析源代码。
又分为:
a. 利用lxr, cscope, source insight等工具交叉索引源代码
b. 利用git,web-git通过阅读增量patch等形式观察源码的进化
c. 利用调试器跟随内核的运行动态观察内核正在运行的代码片段
3.静态数据:观察的对象是内核在运行时产生或收集汇总出来的数据。
又分为:
a. 代码中printk语句打印出来的内核信息
b. 系统出错产生的oops,panic信息
c. 借助systemtap等类似工具提取的内核数据汇总
4.动态数据:借助内核调试器实时观察内核不断产生的数据。
可见内核调试器是最强大的内核分析工具,但它也不是“全功能”的工具。
为什么需要汇编级调试
逆向工程的需要
例子1:NT 内核的进程调度分析笔记 http://www.whitecell.org/list.php?id=11例子2: NT 下动态切换进程分析笔记 http://www.whitecell.org/list.php?id=13
在windows的世界里,内核源码和具体原理是不公开的。但很多牛人就凭一个破烂调试器阅读反汇编代码就能得到内部真相,可见调试器汇编级调试威力之大。但是在linux是源码公开的情况下,就没必要干那样的辛苦活了。但是因为以下原因,汇编级调试还是必要的。
汇编比C语言更低层
有时(比如代码优化)情况下,因为C代码经过了编译器的处理,调试器在c源码调试这个级别下给出的信息是无法理解的,甚至看起来是错误的。但是如果直接对调试器给出的反汇编代码进行分析,就不会受到那类问题的束缚。也就是说,进行汇编级别的调试能最大程度的利用调试器的功能。汇编是C语义的解释
当你对某句C语言不是很理解时,看看编译器是怎么想的,是个很不错的办法。能锻炼汇编源码的阅读能力
另一方面,内核中本来存在很多汇编源代码,进行汇编级调试也是锻炼阅读汇编源码能力的最有效方法。当然,汇编级调试虽然强大,但代价也是很昂贵。和源码级调试相比,分析汇编代码花的时间要多上几十倍。所以,在源码公开的情况下,应该以源码级调试为主,特殊情况下才需要汇编级调试。
------
本文转自《Linux内核调试分析指南》