LinuxRevealed 引言

一、为什么要开设这个博客

  Linux是一个自由和开放源码的类UNIX操作系统。因此,它继承了Unix的很多优秀的特点,比如支持抢占式任务、多线程、虚拟内存、换页、动态链接和TCP/IP等。它诞生于1991年,当时其作者Linus出于兴趣和自己的需要编写了Linux,并将之开源到了Internet上,之后便吸引了很多开发者和黑客对其代码进行修改和完善,从而迅速风靡全球。如今,大到服务器,小到手机、手表等消费电子都采用了Linux内核。尤其对于嵌入式开发来讲,基于Linux的可能占了大半壁江山,因此,深入的学习Linux是不可避免也是非常有必要的。

  我本人基于Linux开发已有七八年时间,工作中经常会遇到各种各样的问题,但是都是遇到什么问题解决什么问题,从而使学习到的知识都是零碎的知识点,并不能形成完整的系统,时间长了,必然导致知识点可能会遗忘。解决工作中遇到的问题其实也是学习Linux的一种途径,但是,现实情况是为了快速解决问题,通过log快速定位到问题之后,再读一下某一部分代码,但是,并没有时间去系统的阅读某部分代码。这种浅尝辄止的做法,只会导致工作更加的被动,技术也得不到提升。为了能够系统学习Linux,我创建了这个博客,从零开始学习并整理Linux。

  这个博客名字叫做Linux revealed,中文名为”透视Linux“,它来源于之前我之前看过一部纪录片Amarica revealed。在这个纪录片中详细的介绍了美国的农业、电力、制造和交通这几个方面,其讲述手法给我以深刻的印象。我在本博客中也会借鉴这种方法,和大家一起学习探讨Linux各模块提供的机制及其代码实现细节,同时,还会思考这些机制产生的背景及必要性。在本博客还会解析Linux代码中一些比较常用或者经典的全局变量函数,并将其分别整理出来,最终形成一个Linux学习使用的百科全书。

二、写作思路

  从结构上看,Linux和其他操作系统一样被划分为了几大模块:内存管理进程调度文件系统驱动程序网络管理。其实,各个模块之间的关系又是紧密结合的。比如,驱动程序在使用过程中,必然要调用内存管理的接口来向操作系统申请内存,而同时为了向用户提供接口,它又会提供一些sys节点,这些sys节点正是调用文件系统的接口来创建的。为了避免在跟踪代码的过程中偏离了主线,我会适当的控制对函数调用深度的跟踪。比如,阅读驱动程序的代码,跟踪到调用文件系统接口时,我会在简单介绍一下该接口的功能后,继续回到驱动程序的代码,往下阅读,而并不会深入该接口在文件系统相关代码的实现。当然,既然这些接口是跨模块使用的,那么其重要性可见一斑,所以,在学习到文件系统对应的代码的时候,我们自然会对这些函数展开详细的分析的。

  对代码的学习既要掌握其接口的使用方法,又要了解其背后运行的原理,还要清楚这部分代码在整个Linux系统中的作用。为了方便理解代码,对于每一个主题,我会先详细介绍其背景以及相关的理论知识,然后,再对该主题中的一些关键函数的代码逐行进行分析,从而归纳出函数的作用,以及在整个主题中的作用。最后,在通过实例来演示这些关键函数的用法,或者演绎该主题的运行原理和框架。这样看起来会有一些重复,但是,学习的过程本身是一个循环往复不断上升的过程。我这么写的目的就是在重复的过程中,对于一个主题能够全方位的理解,不仅掌握其用法,还需要理解其原理,更重要的是理解其在整个系统中的作用。

三、适合人群

  前面我也提到了,我写这个博客的目的,一方面是为了自己系统学习Linux,另外一方面是将学习的资料分类整理,这样也便于复习或者开发过程中使用。同时,我认为知识只有讲出来,才真正意味着自己确实理解了。所以,本博客的读者仅需要掌握C语言,同时对计算机原理相关的知识有一定了解即可。由于Linux本身是一个操作系统,如果读者有操作系统的基础最好。如果没有的话,也没关系,我会在文章中穿插介绍相关内容,并提供相关阅读材料。目的就是使不同水平的对Linux感兴趣的读者都能从本博客中收益。

四、学习环境搭建

  “工欲善其事,必先利其器”,在学习Linux之前,我们需要下载Linux代码,准备阅读代码的环境,还要有Linux代码编译运行的环境。为了更多人能够具有实践的环境,大多数实验都在QEMU环境中去完成。如果确实需要硬件的,我也会尽量选择树莓派这种成本比较低的硬件来做实验。根据每节主题不一样,所需环境不一样,具体的我会在每篇博客的正文之前去介绍。下面,我来简单介绍一下通用环境的搭建。

4.1 Linux环境

  学习Linux首先需要有一台运行Linux的机器,虚拟机也可以,但是最好是一台真正运行Linux的物理机器。Linux有很多发行版,这里推荐Ubuntu,网上相关的资料比较多,出现问题也更容易解决。Ubuntu的版本最好使用长期维护的版本,比如20.04,当然18.04也可以,再早的版本就不推荐了。

  

4.2 代码下载

  Linux源码的官方发布地址是kernel.org。由于Linux代码社区非常活跃,因此,为了便于维护和发布,Linux创建了很多分支,如下图所示。

Linux-branches

  学习Linux代码一定要选取一个较新的Longterm版本,保证自己学习的内容不过时,且长期更新。这里我选择v5.4的版本。只需要点击版本后的tarball就可以下载对应版本代码的压缩包。
  另外,也可以从github上下载Linux源码,具体链接为:https://github.com/torvalds/linux,其下载命令为git clone https://github.com/torvalds/linux.git。需要注意的是这种方法下载的话,一般是同步的Linux主线上最新的代码,如果要想学习某个longterm版本的话,需要使用git tag命令,找到它对应的分支,然后执行git checkout -b xxx yyy(其中,xxx为新建的分支名字,yyy表示该longterm版本对应的tag名)切换到对应的longterm版本。

比如,我想找到v5.4 对应的tag,那么,进入Linux代码目录下,执行git tag之后,显示如下:

$ git tag
v2.6.11
v2.6.11-tree
v2.6.12
...
v5.3-rc8
v5.4      // 我选定的v5.4版本对应的tag名字
v5.4-rc1
...

然后,执行git checkout -b linux-v5.4 v5.4(其中,linux-v5.4是自己起的本地对应5.4版本的分支名, v5.4是v5.4对应的龙term版本的tag名)。那么当前文件夹下的代码即是v5.4对应的代码。

4.2 代码阅读环境

  阅读代码的工具很多,每个人可以根据自己的喜好设置。我本人比较习惯的是Opengrok + vim/ctags/cscope组合。具体来讲,对于不需要修改代码,单纯的阅读、搜索代码时,我习惯在自己搭建的Opengrok上读代码,这样可以很直观方便的搜索、跳转和复制代码。搭建Opengrok的方法可以参考Opengrok的安装及配置。对于需要修改并编译代码时,我更加习惯在Ubuntu系统上,使用ctags和cscope创建代码的tag和索引之后,使用vim打开源码修改和阅读。这两个软件的安装方法很简单,网上有很多相关的资料,大家可以自行搜索安装。方便使用的关键是这两个软件的插件和配置,有需要的同学可以通过公众号后台留言获取。

4.3 运行Linux系统

  前面提到过,为了能够让更多人能够以更低的成本学习Linux,我的大部分实验都在QEMU上运行。QEMU是一种虚拟机,它可以方便的模拟出多种硬件平台运行Linux代码。具体的下载、安装和配置方法可以参考这两篇文章:
  Linux内存管理之一 —— 环境搭建(在QEMU上运行Linux 5.4.0)
  Linux内存管理之二 —— 环境搭建二(使用GDB调试Linux内核)
对于需要物理硬件平台的实验,我会选择树莓派。关于树莓派这里就不多做介绍了。大家可以自行在网上搜索查阅相关资料。

  目前,这个博客主要由我一个人来维护,加之工作原因,更新的频次可能不会太高,但是,我会尽量保证一周更新一篇博客。大家在阅读我的博客同时,有什么建议和意见,欢迎通过公众号或者博客留言和我交流。最后,如果你觉得我的博客写的还行,对你有一定的帮助,欢迎大家点赞、转发以使更多的朋友受益!谢谢!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注