目录

Linux Kernel | Linux 源码阅读工具和资料

阅读 Linux 源码的方式

网上推荐阅读 Linux 源码的方式或者工具有这么几种:source insight、vim+cscope+ctags(再加其他各种插件)以及 vscode+插件的方式。目前,自己正在使用的是 vscode+插件的方式,主要是 vscode 好看,使用起来也没那么鸡肋。那么为什么不选择其他两个呢?

  1. source insight 这款工具确实很强大,但是我就用了 30 分钟左右,一是比较丑,二是不太会用。但是这款工具确实挺强大的就是了。
  2. vim+cscope+ctags(再加其他各种插件),可以说也很强大,这在 Linux 下是极力推荐的。但是,这样使用的话,我复制粘贴代码的时候会有点不太方便。

那么下面具体介绍一下 VSCode + 插件的方式。插件可使用: C++ Intellsense 或者 C/C++ GNU Global。无论选择哪种插件,都会用到 GNU Global 这款工具,即这两款插件背后依赖的是这款工具。

安装 GNU Global

因此,首先需要安装和配置 GNU Global,下面以 windows 为例。从网上下载到 GNU Global 并安装之后如下图所示(需要安装 6.5 版本以上的),

https://img.dawnguo.cn/Linux/kernel/image-20200703103812622.png

之后还需要将 bin 目录所在的路径添加到 PATH 环境变量中。

https://img.dawnguo.cn/Linux/kernel/image-20200703103904044.png

当打开 cmd 之后可以进行测试

https://img.dawnguo.cn/Linux/kernel/image-20200703104148985.png

gtags 其实跟 ctags 和 cscope 这两款工具类似,都会在使用 gtags 的目录下生成几个文件,这些文件包含了相关的代码的主要信息。

插件安装及其使用

GNU Global 安装并配置完成之后,安装插件 C++ Intellsense 或者 C/C++ GNU Global。这两款插件选择其中一款安装即可没必要两个都安装,因为两个的效果是类似的。下面分别介绍这两款插件安装之后的使用:

C/C++ GNU Global

插件安装之后,我们打开 VS Code 的命令行(F1/ctrl+shift+p) ,输入 Global 这几个关键字,会如下图所示:

https://img.dawnguo.cn/Linux/kernel/image-20200703104927687.png

Show GNU Global Version 其实就是显示 global 的版本号,我们真正要使用的是 Rebuild Gtags Database。这个命令会在当前打开的目录下面建立三个文件:GTAGS、GRTAGS、GPTAH,这三个文件就是 gtags 这款工具的 tag 档。

建立完成之后,我们就可以跳转到相关定义处或者查看相关引用了。

https://img.dawnguo.cn/Linux/kernel/1.gif

C++ Intellsense

当然你也可以选择这款插件,效果是类似的。同样,我们需要先生成所需要的三个文件,这样才能进行跳转。此时,我们需要通过命令行的方式来生成那三个文件,输入 gtags . 即可:

https://img.dawnguo.cn/Linux/kernel/image-20200703110032267.png

在三个文件都生成之后,我们同样可以像上面那样进行跳转。

两个都安装并启用呢?

假如两个都安装了并且插件都启用了,那么当你进行跳转的时候,你会发现两个一模一样的跳转信息,因此你可以禁用掉另一个。

https://img.dawnguo.cn/Linux/kernel/image-20200703110200172.png

关于 Linux,几个值得收藏的网址

  1. https://www.kernel.org/

    这个是 Linux 的官方发布网址,在这里你可以看到 Linux 相关的信息,比如最新的发行版、长期的维护版本。

    https://img.dawnguo.cn/Linux/kernel/image-20200703111359596.png

    通过这里你还可以跳转到跟 Linux 相关的网址,比如 https://www.kernel.org/pub/,这个网址相当于 Linux 的 ftp 服务器,里面包含了 Linux 各种发行版。

    https://img.dawnguo.cn/Linux/kernel/image-20200703111743733.png

    你还可以跳转到 Linux git 版本控制的相关信息页面,https://git.kernel.org/ 。这个首页包含了 Linux 内核开发时 commit 提交记录以及相关工具开发时 commit 提交记录。

    https://img.dawnguo.cn/Linux/kernel/image-20200703111727889.png

    除此之外,你还可以跳转 Linux 社区,订阅邮件列表等。这个网址是主要的,必须收藏。

  2. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/about/

    https://git.kernel.org/ 中最主要的是 Linux 内核开发时 commit 提交记录等,网址 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/about/

    https://img.dawnguo.cn/Linux/kernel/image-20200703112045809.png

    在这里你可以使用关键字在 log msg、author 或者 commiter 中进行搜索。

    https://img.dawnguo.cn/Linux/kernel/image-20200703113723909.png

    你还可以查看某个 commit 的具体信息,比如增加、删除了哪些代码。

  3. https://kernelnewbies.org/LinuxVersions

    这个网址我搜了一下,是说比较适合新手参与 Linux 的讨论等,因为订阅邮件列表等方式对新手来说有点困难。但是,我拿这个网址主要是来看版本之间的变化的,点开某个 Linux 发行版之后,就会看到相关 change log 了。

    https://img.dawnguo.cn/Linux/kernel/image-20200703112707203.png

    这个网址会跟前面提到的 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/about/ 这个网址是相关联的,即某个具体的 change log 可以被点击到具体的 commit 信息。

    https://img.dawnguo.cn/Linux/kernel/image-20200703113251081.png

  4. https://elixir.bootlin.com/linux/latest/source

    这个网址可以让你线上查看 Linux 代码并进行搜索、跳转等等。这个在你想要查看多个不同 Linux 发行版的时候,特别有用,因为把 Linux 内核源码下载到本地并配置的话,需要花很多很大功夫。

Linux 推荐的参考书籍

  1. 《Linux 内核设计与实现.第三版》

    个人首推的是这本书,因为这本书会讲一些基础理论的东西、有时也会讲 Linux 这么设计的原因,之后会讲 Linux 中实现的原理(并不涉及到代码),最后还会贴出一些核心代码,这些代码主要是为了更好阐述原理。我觉得想要了解 Linux 系统的原理,但是又不想看很多代码的话,这本书挺适合的。这本书有个不好的就是 Linux 版本比较旧了,但是看原理性的东西并无大碍。

  2. 《深入理解 Linux 内核.第三版.涵盖 2.6 版本》

    这本书跟第一本书一样,都是偏讲原理。这本书比较厚,假如觉得看不完的话,可以选择先看第一本。这本书不好的也还是 Linux 版本比较旧,但是对原理性的东西并无大碍。

  3. 《Linux 内核深度解析-基于 ARM64 架构的 Linux 4.x 内核》

    这本书是我在搬砖过程中参考最多的。大部分 Linux 书籍都是以 x86 架构为例进行讲解,这本书则是以 ARM64 架构为例进行讲解。并且使用的 Linux 内核版本的代码是比较新的。总的来说,这本书给我的感觉是偏向讲 Linux 内核源码是怎么实现的一本书,讲的还行。但是相比前两本书,推荐的人可能就没那么多了。但是假如你想了解 ARM64 架构下 Linux 的内核源码,这本书还是值得推荐的。

  4. 《Linux内核源代码情景分析.毛德操》

    这本书我在网上看的时候,大部分人都还是推荐的,少部分人会吐槽这本书,吐槽点的主要是觉得作者自己都不懂就在那讲,但是我觉得可能是他自己没看懂吧。毕竟 Linux 内核源码这个,光靠一本书是真的很难看懂,一定要跑到源码中去,自己去跟一波不要太细,但是主干的东西要跟。总得来说,这本书偏讲 Linux 内核源码的具体实现,假如你想深入 Linux 内核源码的话,这本书可以参考一下。目前的话,我这本书看的不多,大部分还是根据网上的评论来判断的。

不错的博客推荐

  1. http://www.linuxtcpipstack.com/

    这个博客是专门讲 Linux TCP/IP 协议栈的实现,而且是从代码角度出发,一行一行代码给你讲过去。想了解 TCP/IP 在 Linux 中的具体实现的话,值得参考。但是使用的 Linux 的内核版本稍微有点旧。

  2. http://www.wowotech.net/

    Linux 的代码它几乎都会讲。但是讲的吧,可能不太对我的胃口。我没了解一个知识点之前,我看的时候觉得不太对我的胃口,等我对一个知识点有所了解之后,再回过头来看,我发现还是不太符合我的胃口。但是由于讲的内容还是挺全的,所以还是贴出来。萝卜青菜各有所爱吧。

碎碎念

对于阅读 Linux 内核源码的一些总结:我觉得要深入阅读一块内核源码的话

  1. 首先需要对理论和原理性知识进行了解,这是前提,你都不知道进程是个啥,Linux 进程的原理是啥,就直接切入源码的话是真的会懵逼。
  2. 之后的话,我觉得你需要照着原理先了解一下大概实现流程,最好把 Linux 函数跳转的路径记下来,这个时候画个流程图会更加直观。这一步我觉得你起码要能讲出大致的实现过程,比如消息队列在内核实现时采用了哪些的数据结构、主要使用的函数有哪些、这些函数的主要功能是什么以及大致实现流程是怎么样的。
  3. 最后的话,那就是你差不多可以深入每一块代码了,去找一下细节上的实现了。比如消息队列是怎么将数据从用户态拷贝到内核态的、消息队列是怎么唤醒阻塞的进程的。这些我觉得有时候是需要的,但是有时候又可以不用。这个一是看你自己是不是感兴趣以及这个细节实现是不是这个知识点的核心。
  4. 学会抛弃,上面深入每一块代码的时候,其实有些代码并不是这块知识的核心内容,那么你可以先抛弃,主要去研究相关知识点的具体实现内容。当然不是啥都抛弃,不能因为看不懂就抛(虽然我好像就是这样)。
  5. 挖 Linux 是一个需要耐心的过程,但是一旦挖完之后我觉得你会有不一样的收获。毕竟这是第一手资料,相比一些博客中写的,你会看到更多。而且有些博客也都是借鉴了其他博客,所以你真的想了解一块知识的时候,你会发现这些博客都是类似的。

巨人的肩膀

  1. 源码阅读的方法集合
  2. VS Code + GNU Global - 打造 Trace Linux Kernel 環境