Linux内核源码分析 1:Linux内核体系架构和学习路线
好久没有动笔写文章了,这段时间经历了蛮多事情的。这段时间自己写了一两个基于不同指令集的Linux
内核,x86
和RISC-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_struct
、container_of
…… - 而后我们学习
Linux
线程管理相关的函数,例如:thread_yield
、thread_block
、switch_to
…… - 最后我们学习
Linux
线程管理的相关策略,例如:多级队列调度、CFS
调度器,以及根据实际应用场景进行优化的策略……
而针对每个模块的学习,其实就是搞清楚这个模块的宏和函数的作用,再搞清楚对应的调用逻辑。
2. 学习路线
Linux
内核由五大主要子系统组成,它们之间有关系如下:
对应的,我计划未来将要学习的模块有:
- 进程管理模块
- 内存管理模块
- 网络模块
- 文件系统
- 进程通信模块
最后准备做一些机器人嵌入式相关的裁剪之类的项目