此文包含 Linux 系统的学习路径和书籍推荐


我觉得学习 Linux 系统,内核驱动时,最开始只需要 ‘Know what, not know how ’。 不用去探究细节,只需要知道整体的框架,知道有哪些需要我们重视的内容即可。

何为 Linux 内核开发?

首先,初步认识下 Linux kernel

何为 Linux 内核开发,怎么学好 Linux 内核?_设备驱动


  • Linux 内核的框架如上图。
  • 设备子系统负责和硬件打交道。
  • 大部分工作集中在设备子系统部分。

内核开发是什么?


  • 广义上讲,新增或修改上图中内核部分的所有子系统。
  • 非 Linux 源码贡献者,一般来说只修改设备子系统部分。

接下来,简单聊聊初学者需要重点关注的三个部分:设备树,字符设备,平台设备驱动。

设备树(DTS)

设备树相当于一份软件中描述硬件结构的配置框图。假设下图为硬件框图:

何为 Linux 内核开发,怎么学好 Linux 内核?_嵌入式_02

那么其软件描述的代码片段如下:

/ { // root node
model = "Qualcomm Technologies, Inc. SDM xxx";
compatible = "qcom,sdmxxx";
cpus {
...
cpu@0 {
...
};
cpu@1 {
...
};
};
usb@<address> {
...
};
serial@<address> {
...
};
gpio@<address> {
...
};
intc: interrupt-controller@<address> {
...
};
external-bus {
...
i2c@0,0 {
...
xxx@<address> { // I2C Dev
....
};
};
flash@1,0 {
...
};
};
};

字符设备驱动


  • 字符设备驱动是理解设备驱动的基础。
  • 大多数设备都可以归于字符设备。
    何为 Linux 内核开发,怎么学好 Linux 内核?_设备驱动_03

kernel 开发需要什么样的知识储备?


我觉得这部分可以当着 Linux 系统的学习路径了。


C 语言

良好的 C 语言能力是必要条件, Linux 官方推荐了如下书籍。


  • The C Programming Language
  • Practical C Programming
  • C: A Reference Manual

不过我觉得结合如下书籍一步步学习会更适合学习:

《啊哈 C 语言》入门书籍,号称马桶上看的 C 语言,通俗易懂。

《The C Programming Language》的中文版 《C 程序设计语言》,英文版也是很好一个选择的,一书两用,技术和英语都学习了。我觉得这一本是学习 C 语言的朋友们,必读的一本。

何为 Linux 内核开发,怎么学好 Linux 内核?_Linux内核_04

3. 《C 专家编程》,这本书主要讲语法特性,告诉我们 C 语言是怎么设计出来的,看了这本书,我们可以更深刻的理解每一行代码。

何为 Linux 内核开发,怎么学好 Linux 内核?_Linux内核_05

4. 《C 缺陷与陷阱》,《C 专家编程 》的延续,针对性更强,告诉我们 C 语言这个工具的缺陷与陷阱,让我们使用 c 语言时更加游刃有余。

何为 Linux 内核开发,怎么学好 Linux 内核?_设备树_06

5.《数据结构与算法分析 : C语言描述》,入门数据结构与算法,也是一本经典书籍,比《算法导论》那边砖头厚的书友好得多。

何为 Linux 内核开发,怎么学好 Linux 内核?_设备驱动_07

GNU

这个也可以归为 C 语言里面,内核由 GNU C 和 GNU toolchain 实现,所以如下两方面的知识是需要的。


  • GNU C 的编码规则
  • GNU 工具链的使用

Linux 基本命令

学习 Linux 前,我们需要先熟悉 Linux 的“命令行 + 文件”的使用模式,要想学好一个东西,开始肯定需要用好这个东西。《鸟哥的 Linux 私房菜》应该是最适合初学者的一本书了。

何为 Linux 内核开发,怎么学好 Linux 内核?_linux_08

如果想深入的话,推荐 《Linux 系统管理技术手册》,这本书很厚,算是 Linux 运维必备的手册。

何为 Linux 内核开发,怎么学好 Linux 内核?_设备树_09

应用程序设计

通过系统调用或者 glibc,学会自己进行程序设计。如果每个系统调用都深入地学习、看书看文档、做实验,这样坚持一段时间,啃下这些东西,就很接近操作系统的原理了,就能看到另一番风景,甚至在应用编程时会有一览宗山小的感觉。参考书籍首推《UNIX 环境高级编程》,有代码,有介绍,有原理,非常实用。

何为 Linux 内核开发,怎么学好 Linux 内核?_Linux内核_10

设备驱动相关知识

设备驱动方面的知识看下《Linux 设备驱动程序》应该就差不多了, 国内宋宝华写的《Linux 设备驱动开发详解》也还可以。

何为 Linux 内核开发,怎么学好 Linux 内核?_设备驱动_11

内核原理

学习内核原理的话,推荐《Linux 内核设计与实现》,《Linux 内核完全注释》,《深入理解 Linux 内核 》三本书,当然也可以只买《深入理解 Linux 内核 》, 本书言简意赅地讲述了主要的内核机制。

何为 Linux 内核开发,怎么学好 Linux 内核?_嵌入式_12

阅读源码

一开始阅读代码不要纠结一城一池的得失,不要每一行都一定要搞清楚它是干嘛的,而要聚焦于核心逻辑和使用场景。

《Linux 内核源代码情景分析》是一本很适合参考的书,这本书最大的优点是结合场景进行分析,看得见、摸得着,非常直观,唯一的缺点还是内核版本比较老

何为 Linux 内核开发,怎么学好 Linux 内核?_设备树_13

Linux内核学习资料 教学视频​​​

何为 Linux 内核开发,怎么学好 Linux 内核?_linux_14

何为 Linux 内核开发,怎么学好 Linux 内核?_嵌入式_15

实践

实现一个设备驱动程序,重新实现一些系统调用,或者重新实现一个文件系统或其他子系统等等。这部分难度会比较大,需要自己搞清楚所有细节,但是只要熬出来了,进步的愉悦是难以言说的。

总结

其实这部分内容已经不仅仅是针对内核开发了,而是针对 Linux 系统。C 语言, Linux 命令行,应用程序设计,设备驱动,内核原理,阅读源码, 实践, 只要我们踏实地把这样七个步骤走完,基本就已经领先绝大多数人了(甚至可以说 98% 以上,我也还在路上​_​),工作中 Linux 系统相关的绝大多数问题也难不倒你了,接下来就是在实战中不停地被捶打,最后成为一代宗师。

当然如果只是对内核和驱动感兴趣,应用程序设计部分可以不用花太多时间。