中年如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤
作者简介:陈华才(龙芯3号Maintainer) , 博士 , 高级工程师 , 负责龙芯3号处理器的内核开发 。 作为Linux内核中MIPS/ 龙芯3 号的Maintainer , 向Linux内核官方提交了大量的代码 。
阅读软件源代码是每个开发者的必由之路 , 尤其是内核开发者 。 因为内核开发在很大程度上并不是重新发明轮子 , 而是深入理解并尽量复用现有的内核设计框架 , 然后参照相似的功能模块去添加或改写某项需要的功能 。 在对内核整体框架以及某些子系统融会贯通以后 , 才有可能站在巨人的肩膀上去改进框架本身 , 实现自主创新 。 就我的个人经验来说 , 阅读代码与编写代码的时间大概是6 : 4 。
自由软件的开发与商业软件相比 , 有一个很大的不同就是文档相对比较缺乏 。 但同时有一种说法叫做“代码就是最好的文档”——只要你愿意 , 没什么学不会的 。 那么 , 像Linux内核这样动辄上千万行代码的浩大工程 , 该如何读懂 , 又从哪里读起?
为此 , 我梳理了自己在十余年Linux内核相关的工作经验 , 总结了一套可行的代码阅读方法:基于“广度优先”的大原则 , “三部曲”具体实现 , 理解补丁文件 。
?广度优先原则 建议用“广度优先”的方式阅读代码 。
“广度优先”指的是当我们在阅读一个函数的时候 , 先看看这个函数整体上在一步一步完成什么工作 , 等基本掌握要领以后 , 再逐个去了解其所调用的子函数 。 与之对应的“深度优先”方法 , 一上来就把第一个子函数以及子函数的子函数弄清楚 , 这里并不推荐采用 。
代码好比一棵树 , “广度优先”就是说我们要先找到主干 , 然后搞清楚主干上有几根树枝 , 再去某条感兴趣的树枝上寻找有意义的叶子;而“深度优先”则是随便碰到一根树枝 , 就赶紧深入进去把所有的叶子给找出来 。 广度优先会让你有一种“会当临绝顶 , 一览众山小”的自信;而深度优先会让你有一种“不识庐山真面目 , 只缘身在此山中”的迷茫 。
基于“广度优先”的大原则 , 我们更进一步来详细解析“三部曲”的具体实现方法 。 “三部曲”依次是:找准入口点 , 理清主脉络 , 顾名思义看功能 。
?找准入口点 “三部曲”的第一步是找准入口点 。
Linux内核基本上由C语言和汇编语言组成 , 在C语言里面 , 大家都知道应用程序的入口点是main()函数 , 其实内核也是比较类似的 。 以相对独立的内核模块为例 , 在绝大多数情况下 , 如果模块的名字是modname , 那么模块的入口函数就是modname_init() 。 万一不是 , 可以在相关文件目录里面用module_init进行搜索 , 因为模块入口一般会用module_init(mod_entry)或者类似的方式进行声明(这里mod_entry指的是模块的入口函数名字) 。
那么内核本身的入口又在哪里呢?凭直觉 , 凭经验 , 总会跟start、init、entry之类的词汇有些关联 。 初始入口(第一入口)是体系结构相关的 , 在汇编语言代码里面;而通用入口(第二入口)是体系结构无关的 , 在C语言里面——实际上就是init/main.c里面的start_kernel() 。 顺便说一下 , 包括龙芯在内的所有MIPS处理器 , 第一入口都是arch/mips/ kernel/head.S里面的kernel_entry 。 CPU执行的第一条内核指令就在初始入口kernel_entry , 而kernel_entry之后的代码在完成与体系结构高度相关的初始化以后 , 会跳转到通用入口start_kernel()执行 。
?理清主脉络 “三部曲”的第二步是理清主脉络 。 这一步的原则是“去粗取精”:去掉没用的 , 留下有用的 。
眼不见为净 , 影响阅读的直接统统删除 。 当然了 , 我们并不是建议在原始代码库中直接删除 , 而是建议一边看代码一边做笔记 , 先把函数复制到笔记里面 , 然后再根据需要逐步删除 , 直到留下主脉络 。
那么什么叫“有用”的 , 什么叫“没用”的?既然已经进入了内核源代码库 , 当然每一句都是有用的 , 这里所说的有用或者没用 , 仅仅指的是对理解主脉络有利还是不利 。 而“有利”或者“不利”又是分多个层次的 。
推荐阅读
- 湖人队|扎心?一张图看湖人如何应对马赛克三分雨,神龟5米范围没人理他
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 想好好做医生的胖子|五十岁女性经常有周身无力和疼痛的困扰!该如何应对?医生告诉您
- 儿童饮食|秋冬季如何让宝宝爱上吃水果?稍微蒸一下美味翻倍,营养价值更高
- 队员|北极科考中“遭遇”北极熊,看科考队员如何与它们和谐相处
- 中国历史发展过程|中国历史发展过程!中国游戏外挂发展史:“辅助工具”是如何成长为“苍
- 金色年华录|都是男扮女装谈恋爱,《少女大人》比《女世子》如何?
- 上海市嘉定区人民政府网站|每年消耗3350吨蔬菜150吨肉,嘉定这家中央厨房如何践行“光盘行动”?
- 上海嘉定|如何让《民法典》走进群众心里?嘉定这些街镇和单位这样做
- 没蜡笔的小新|“整容脸”应该被鄙视吗?医生告诉你千篇一律的好看皮囊如何而来
