浅谈Linux内核源码分析方法( 二 )

~)给你的代码 , 为什么给我们的感觉大相径庭呢?我觉得有以下原因:
1Linux内核代码在“外界”看来多少有些神秘感 , 而且它很庞大 , 猛地摆在面前可能感觉无法下手 。 比如可能来源于一个很细小的原因——找不到main函数 。 对于简单的demo程序 , 我们可以从头至尾的分析代码的含义 , 但是分析内核代码这招就彻底失效了 , 因为没有人能把Linux代码从头到尾看上一遍(因为确实没有必要 , 用到时看就可以了) 。
2.不少人也接触过大型软件的代码 , 但多数属于应用型项目 , 代码的形式和含义都和自己常接触的业务逻辑相关 。 而内核代码不同 , 它处理的信息多数和计算机底层密切相关 。 比如操作系统、编译器、汇编、体系结构等相关的知识的欠缺 , 也会让阅读内核代码障碍重重 。
3.分析内核代码的方法不够合理 。 面对大量的并且复杂的内核代码 , 如果不从全局的角度入手 , 很容易陷入代码细节的泥淖中 。 内核代码虽然庞大 , 但是它也有它的设计原则和架构 , 否则维护它对任何人来说都是一个噩梦!如果我们理清代码模块的整体设计思路 , 再去分析代码的实现 , 可能分析源码就是一件轻松快乐的事情了 。
针对这些问题 , 我个人是这样理解的 。 如果没有接触过大型软件项目 , 可能分析Linux内核代码是一个很好的积累大型项目经验的机会(确实 , Linux代码是我目前接触到的最大的项目了!) 。 如果你对计算机底层了解的不够透彻 , 那么我们可以选择边分析边学习的方式去积累底层的知识 。 可能刚开始分析代码的进度会稍显迟缓 , 但是随着知识的不断积累 , 我们对Linux内核的“业务逻辑”会逐渐明朗起来 。 最后一点 , 如何从全局的角度把握分析的源码 , 这也是我想与大家分享的经验 。
需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等) , 免费分享
浅谈Linux内核源码分析方法文章插图
三、内核源码分析方法
第一步:资料搜集
从人认识新事物的角度来讲 , 在探索事物本质之前 , 必须有一个了解新鲜事物的过程 , 这个过程是的我们对新鲜事物产生一个初步的概念 。 比如我们想学习钢琴 , 那么我们需要先了解弹奏钢琴需要我们学习基本的乐理、简谱、五线谱等基础知识 , 然后学习钢琴弹奏的技巧和指法 , 最后才能真正的开始练习钢琴 。
分析内核代码也是如此 , 首先我们需要定位要分析的代码涉及的内容 。 是进程同步和调度的代码 , 是内存管理的代码 , 还是设备管理的代码 , 还是系统启动的代码等等 。 内核的庞大决定着我们不能一次性将内核代码全部分析完成 , 因此我们需要给自己一个合理的分工 。 正如算法设计告诉我们的 , 要解决一个大问题 , 首先要解决它所涉及的子问题 。
定位好要分析的代码范围 , 我们就可以动用手头的一切资源 , 尽可能的全面了解该部分代码的整体结构和大致功能 。
浅谈Linux内核源码分析方法文章插图
这里所说的一切资源是指无论是BaiduGoogle大型网络搜索引擎 , 还是操作系统原理教材和专业书籍 , 亦或是他人提供的经验和资料 , 甚至是Linux源码提供的文档、注释和源码标识符的名称(不要小看代码中的标识符的命名 , 有时它们能提供关键的信息) 。 总之这里的一切资源指的就是你能想到的一切可用资源 。 当然 , 我们不太可能通过这种形式的信息搜集获得所有的我们想要的信息 , 我们只求尽可能全面即可 。 因为信息搜集的越全面 , 之后分析代码的过程能使用的信息就更多 , 分析过程的困难就会越小 。


推荐阅读