为什么要阅读Linux内核源码以及如何阅读Linux内核源码

2021-05-28 10:12:19 浏览数 (1)

阅读源码目的:为了更好地编写驱动程序;对自己写的程序有更深入的理解;并且自己的岗位定位在底层开发。

获取内核源码:

https://www.kernel.org/

阅读linux内核,常用下面两种方法:

  1. bochs linux0.11 书(linux内核完全注释、linux内核完全剖析、linux内核设计的艺术)
  2. Source Insight linux2.X 书(linux内核情景分析)
  3. 另外:笨叔叔近两年出的两本书不错,《奔跑吧Linux内核 入门篇》和《奔跑吧Linux内核 》基于Linux4.x,只是配套视频有点贵,但是书写的很不错,以实际问题出发,在实际工作中很有用。

阅读源码分为纵向阅读和横向阅读。纵向就是跟着内核的执行流程来读,横向就是按照内核的各大功能模块来读。

第一种方法纵向或者横向来读都可以,因为代码量不是很大。《linux内核完全剖析》《linux内核完全注释》是引导你横向阅读的书,《linux内核设计的艺术》是引导你纵向阅读的书。建议横向纵向结合着来,纵向跟着bochs调试工具来是必不可少的,当遇到问题时进入到相应的功能模块横向拓展一下。

《linux内核情景分析》中的内核版本是2.4.X,现代内核版本还是推荐横向阅读,纵向几乎不可能。(在Linux下搭建了quem虚拟机,然后用GDB调试内核也可以)总之阅读源码的方法也就上面两种,贵在坚持,但是别闭门N久学内核,没有意义。而且长时间只读代码,不敲代码是不行的。

如果想在简历中写上关于Linux内核的经验,先不要花大量时间看源码,先把《linux内核设计与实现》读了,在找工作中更有用。

Linux5.8.14

通常Linux会有以下目录

arch 子目录包括所有和体系结构相关的核心代码。它还有更深的子目录,每一个代表一种支持的体系结构

include 子目录包括编译核心所需要的大部分 include 文件。它也有更深的子目录,每一个支持的体系结构一个。include/asm 是这个体系结构所需要的真实的 include 目录的软链接,例如 include/asm-i386 。为了改变体系结构,你需要编辑核心的 makefile ,重新运行 Linux 的核心配置程序

init 这个目录包含核心的初始化代码,这时研究核心如何工作的一个非常好的起点

mm 这个目录包括所有的内存管理代码。和体系结构相关的内存管理代码位于 arch/*/mm/

drivers 系统所有的设备驱动程序在这个目录。它们被划分成设备驱动程序类

ipc 这个目录包含核心的进程间通讯的代码

modules 这只是一个用来存放建立好的模块的目录

fs 所有的文件系统代码。被划分成子目录,每一个支持的文件系统一个

kernel 主要的核心代码。同样,和体系相关的核心代码放在 arch/*/kernel

net 核心的网络代码

lib 这个目录放置核心的库代码。和体系结构相关的库代码在 arch/*/lib/

scripts 这个目录包含脚本(例如 awk 和 tk 脚本),用于配置核心

按照以下顺序阅读源代码会轻松点

核心功能(kernel)

内存管理(mm)

文件系统(fs)

进程通讯(ipc)

网络(net)

系统启动和初始化(init/main和head.S)

其他等等

建议书籍说明(参考):

1, 《Linux内核设计与实现》,英文名Linux Kernel Development(所以有人叫它LKD),机械工业出版社,美国Robert Love著,陈莉君译者。评说:   此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。这本书讲解浅显易懂,全书没有列举一条汇编语句,但是给出了整个Linux操作系统2.6内核的概观,使你能通过阅读迅速获得一个overview。而且对内核中较为混乱的部分(如下半部),它的讲解是最透彻的。对没怎么深入内核的人来说,这是强烈推荐的一本书。

2, 《Linux内核源代码情景分析》上、下。毛德操、胡希明著,浙江大学出版社,评说:   本书是基于2.4.0内核的。上册讲解内存管理、中断、异常与系统调用、进程控制、文件系统与传统Unix IPC;下册讲解socket、设备驱动、SMP和引导。关于这套书的评价褒贬不一,我个人认为其深度是同类著作中最优秀的。本书基于Intel IA32体系,由于厚度大,很多体系上的知识都捎带讲解了,所以如果你想深入了解内核的工作机制而又不非常熟悉Intel CPU的体系构造,本书是最合适的。缺点是:版本较老,没有TCP/IP协议栈部分(它讲的socket只是Unix域协议的),图表太少,不适合初学者入门。还有就是对学生朋友来说,可能书价偏高,这样的话可以考虑先买上册,因为上册是核心部分,下册一大部分都在讲具体PCI/ISA/USB设备的驱动。

3, 《深入理解Linux内核》第二版。中国电力出版社。也是陈莉君译。此书是Linux内核黑客在推荐图书时的首选。评说:   此书图表很多,形象地给出了关键数据结构的定义,与《情景分析》相比,本书内容紧凑,不会一个问题讲解动辄上百页,有提纲挈领的功用,但是深度上要逊于《情景分析》。

4, 其它的几本书。市面上能见到的其它的Linux内核的图书,《Linux设备驱动程序》、《Linux内核源代码完全注释》以及新出的《Linux内核分析及编程》等。   《Linux设备驱动程序》第二版是基于2.4的,中文翻译不错,中国电力出版。这书强调动手实践,但它是讲解“设备驱动”的,不是最核心的东西,而且有些东西没硬件的话无法实践,可能更适合驱动开发的程序员吧,不太适合那些For fun and profit的人。此书有第三版英文版,东南大学出版社影印,讲解2.6的,行文流畅,讲解的面也比第二版更广泛,我读过其中关于同步与互斥、内存分配的部分,感觉很不错。   《Linux内核源代码完全注释》(机械工业出版社)是同济大学的博士生赵炯的著作,讲解0.1Linux内核,我没买也没看,有看过的朋友说一说。   《Linux内核分析及编程》(电子工业出版社)是刚刚出版的,国人写的,讲解2.6.11 。很多人说好,但有人说不够系统,我没买,不敢评说。   还有一本清华出的《Linux内核编程指南(第三版)》,原书应该是好书,但是翻译、排版十分糟烂,脱字跳行,根本没法看,我买了一本又扔掉了。

5, 其它资源。TLDP(The Linux Documentation Project)有大量文档,其中不少是关于内核的,有些是在国外出版过的,像《Linux Kernel Interls》《The Linux Kernel》《Linux Kernel Module Programming Guide》等,作者都是亲身参加开发的人,著作较为可信。

6, 一本不是讲解Linux的书:《现代体系结构上的Unix系统:内核程序员的SMP和Caching技术》,人民邮电出版社2003版, 本书虽然不是讲解Linux,但是对所有Unix内核都是适用的,适合对SMP和CPU的Cache这些组成原理知识不是很熟的朋友,而且是很多国外牛人推荐的书。中文版翻译非常负责。

在线阅读Linux内核源码网站:

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

初学者建议书籍(实拍):

个人建议内核和驱动一起学。

如果喜欢我的文章,欢迎关注、点赞和转发,下面可以留言~~~

0 人点赞