中年如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤( 五 )
这就是最终剩下的主脉络!非常清晰明了 , 那么 , 这个函数到底在干什么呢?让我们开始“三部曲”的第三步 。
?顾名思义看功能 前面我们提到 , 代码就像一棵树 , 因此本文选用一种树形视图来表示函数 。 依旧以GXemul为例 , 前面经过五轮精简的main()函数 , 稍作处理后可以按下面的方法表示:
main() |-- console_init() |-- cpu_init() |-- device_init() |-- machine_init() |-- timer_init() |-- useremul_init() |-- emuls[0] = emul_new(NULL) |-- get_cmd_args(argc, argv, emuls[0], &diskimages, &n_diskimages) |-- for (i=0 i<n_diskimages i++) diskimage_add(emuls[0]->machines[0], diskimages[i]) |-- emul_simple_init(emuls[0]) |-- emul_run(emuls, n_emuls) | |-- console_init_main(emuls[0]) | |-- for (j=0 jn_machines j++) cpu_run_init(e->machines[j]) | |-- timer_start() | |-- for (j=0 jn_machines j++) machine_run(e->machines[j]) | |-- timer_stop() | |-- for (j=0 jn_machines j++) cpu_run_deinit(e->machines[j]) | -- console_deinit_main()|-- console_deinit() -- emul_destroy(emuls[i])
其中main()函数为根节点 , 五轮精简后的每一行为根节点的下级节点 , 进一步展开感兴趣的下级节点(如树形视图中的emul_run()函数) , 可以得到更下一级的叶子节点 。 树形视图中的每行代码 , 甚至不需要看其实现细节 , 光靠“顾名思义”就能大概知道其功能了 。 比如console_init()是控制台初始化 , cpu_init()是处理器初始化 , device_init()是设备初始化 , machine_init()是机器架构初始化 , timer_init()是时钟初始化 , useremul_init()是用户模拟器初始化 , diskimage_add()是添加磁盘设备 , emul_simple_init()是模拟机器的初始化 , 而emul_run()显然是核心中的核心 , 即模拟器运行的主事件循环(通过进一步展开的下级节点也证实了这一点) 。
树形视图是一种自顶向下鸟瞰全局的宏观视图 , 但有时候我们特别希望能有一种方法能够清晰地表述某个很深的函数调用 , 因此作为补充 , 本文推荐一种叫链式视图的表示法 。 比如Radeon显卡驱动中的模式设置函数drm_crtc_helper_set_mode() , 在首次模式设置中从驱动入口函数开始一路向下的调用链展示如下:
本文插图
这是一条很长的调用链 , 非常具有典型意义 。
在很多解析源代码的书籍中 , 都会使用流程图来描述代码逻辑 。 然而 , 流程图虽然直观 , 但是其描述能力有限(尤其是缺乏树形源代码视图的层次化表达能力) , 往往很难精确描述一个函数的执行过程 。 而一个费尽心机画出来的精确的流程图 , 往往又会因为其复杂性而失去了直观的功能 。 并且 , 单靠流程图并不能完全理解源代码 , 而是需要将源代码与流程图两相对照 。
因此用精简版的源代码(即树形视图和链式视图)来代替流程图 , 一方面可以快速理解多级函数的复杂调用关系 , 另一方面可以不需要在源代码和流程图之间反复切换 。
?理解补丁文件 阅读软件源代码 , 尤其是Linux内核源代码时 , 不可避免地要接触补丁文件 , 那么什么是补丁文件呢?其实 , 补丁文件就是一个变更集 , 它描述了源代码从旧版本到新版本之间的差异变化 , 或者更一般地说 , 描述了源代码从一个状态变到另一个状态的差异(不一定是从旧版本到新版本) 。
如果用数学方法来表达 , 就是:
公式1:源代码差异 = 源代码状态B – 源代码状态A
也可以反过来表达:
公式2:源代码状态A + 源代码差异 = 源代码状态B
推荐阅读
- 湖人队|扎心?一张图看湖人如何应对马赛克三分雨,神龟5米范围没人理他
- 搜狐新闻|准大学生数码三件套如何选?这些元气好物值得种草
- 想好好做医生的胖子|五十岁女性经常有周身无力和疼痛的困扰!该如何应对?医生告诉您
- 儿童饮食|秋冬季如何让宝宝爱上吃水果?稍微蒸一下美味翻倍,营养价值更高
- 队员|北极科考中“遭遇”北极熊,看科考队员如何与它们和谐相处
- 中国历史发展过程|中国历史发展过程!中国游戏外挂发展史:“辅助工具”是如何成长为“苍
- 金色年华录|都是男扮女装谈恋爱,《少女大人》比《女世子》如何?
- 上海市嘉定区人民政府网站|每年消耗3350吨蔬菜150吨肉,嘉定这家中央厨房如何践行“光盘行动”?
- 上海嘉定|如何让《民法典》走进群众心里?嘉定这些街镇和单位这样做
- 没蜡笔的小新|“整容脸”应该被鄙视吗?医生告诉你千篇一律的好看皮囊如何而来
