好久没有动笔写文章了,这段时间经历了蛮多事情的。这段时间自己写了一两个基于不同指令集的Linux内核,x86RISC-V。期间也去做了一些嵌入式相关的工作,研究了一下ARM指令集架构。

虽然今年九月份我就要申请了,具体申请AI方向还是机器人、嵌入式、操作系统、体系结构亦或是网络、安全、虚拟化还不知道到底要申请哪个,还没定下来,感觉比较迷茫,感觉什么都蛮喜欢的,都挺感兴趣的,都可以做,因为兴趣比较广泛,大学这几年都有所研究。但是不论如何,未来我的研究方向还是会使用到Linux的,而且未来的我的工作也肯定会和Linux相关,所以研究Linux内核对我肯定是好处的。

其次,虽然我自己写过操作系统内核,但我自己的内核各方面都是调简单的实现的,完全没有硬件抽象层Hardware Abstraction Layer)、体系抽层Architecture Abstraction Layer)这些让操作系统更加通用的设计;实现的算法也都是最简单的算法,没有Linux中的多级队列调度器CFS调度器……可能也正是因为自己写过这些代码,所以就想看看Linux大神是如何实现同样的功能的,想从他们的代码中学习。

最后,虽然我对于操作系统这门课程的内容掌握的可能会比较深入,相比于只是上了这门课的学生而言,我自己从系统的启动,再到开启分页机制、构建内核线程等等内容可能会很熟悉,但是却距离工作使用仍然有不小的距离,例如前几天面试了快手的内核实习生,结果问到glibc的内容时候一概不知。所以深感自己的不足,还是需要实习。可能我目前就是预训练好的一个参数,还需要finetune到工作上去。

因此,我决定详细阅读一下Linux的内核源码,既是满足提高自己的码力,也是出于自己的兴趣,同时也对未来的科研、学习、工作有益。

一、Linux内核体系架构

在开始阅读Linux源码学习之前,需要明白Linux内核的体系结构,搞清楚我们学习的对象。

Linux内核体系结构如下:

  • 最底层是硬件设备。这一部分的工作是硬件工程师、嵌入式工程师的任务,不是我们要学习的内容
  • 中间是内核空间Linux内核运行在这一个空间下,因此这就是我们要学习的内容
  • 最上面是用户空间。用户程序通过Linux内核提供的系统调用来实现诸多功能,例如用户自己写的程序、glibc虚拟机……这一部分也不是我们要学习的内容

所以,只有运行在内核空间中的Linux内核才是我们要学习的对象。

二、学习路线

1. 学习方法

从上面的图就能看出来,Linux内核是一个很庞大的工程,内部能够分成多个不同的组件,因此我们学习Linux内核的方法,其实是分模块的逐个学习。例如:

  • 我们学习Linux的线程管理,那么我们就会学习Linux用于描述线程的结构体和宏,例如:task_structcontainer_of……
  • 而后我们学习Linux线程管理相关的函数,例如:thread_yieldthread_blockswitch_to……
  • 最后我们学习Linux线程管理的相关策略,例如:多级队列调度、CFS调度器,以及根据实际应用场景进行优化的策略……

而针对每个模块的学习,其实就是搞清楚这个模块的宏和函数的作用,再搞清楚对应的调用逻辑。

2. 学习路线

Linux内核由五大主要子系统组成,它们之间有关系如下:

对应的,我计划未来将要学习的模块有:

  • 进程管理模块
  • 内存管理模块
  • 网络模块
  • 文件系统
  • 进程通信模块

最后准备做一些机器人嵌入式相关的裁剪之类的项目