如何学习Linux

知识从哪里来


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.org

9. 获取内核文档

源码本身
源码中的注释
内核源码附带的文档 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 Development

2.参考源码读书(读书为主)

参考书籍:understanding the linux kernel

3.参考书读源码(看源码为主)

参考书籍:情景分析

4.只看源码不/少读书(提交补丁为主)

参考:lkml,main-tree, mm-tree

linux内核分析方法:


按分析的对象分:


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内核调试分析指南》

你可能感兴趣的:(linux)