Linux 内核开发入门所需的书
《Linux 内核编程》(第二版)是任何有兴趣为 Linux 内核编写代码的人的必读之作。
我总是在互联网上搜索一本与 Robert Love 的《Linux 内核开发》和 Marco Cesati 的《理解 Linux 内核》等书相当的书。
这两本书都是很棒的书,但遗憾的是由于 Linux 内核的代码库变化很快,现在已经过时了。
我有幸很早就收到了《Linux 内核编程》的第二版,同时也拥有我自己的第一版。让我们来回顾一下吧!
如果你觉得我同情作者,那是因为我明白 Linux 内核是一个深不可测的东西。工程浩大,复杂程度前所未闻。
Linux 内核编程(第二版)
正如标题所提到的,这篇评论是针对 Kaiwan N. Billimoria 撰写的《Linux 内核编程》一书的第二版。在本节中,我将向您介绍第二版的概述。第一版和第二版之间的主要区别在于Linux内核从5.4版本升级到6.1版本。
这是一本实践书籍,因此您需要执行练习。这就是您将学习的方式。此 GitHub 存储库中提供了所有必要的代码。随意叉!
该书可在 Amazon 和 Packt 网站上购买。
本书附带了一些作业,您可以完成这些作业来挑战您的理解并重新审视您认为困难的主题。
首先简要介绍了 Linux 内核、其源代码和起源。它总共13章,每一章都比前一章涵盖更多细节,并填补了您可能遇到的问题的空白。
虽然我不会在这里复制粘贴本书的索引,但我将列出作者向您介绍 Linux 内核的一般流程。
Linux内核的基本介绍
为了向您介绍 Linux 内核,作者涵盖了以下主题:
创建用于Linux内核开发的专用虚拟机并设置环境。您现在不希望坏内核或内核模块导致您的主 PC 崩溃,对吗?
熟悉 Linux 版本命名法,包括所有存在的各种树。
在 Linux 内核
Kconfig
(内核配置)文件中创建一个简单的自定义菜单条目。构建 Linux 内核并安装它。这是针对本机 x86_64 目标以及针对 Raspberry Pi 4 等 64 位 ARM 目标的交叉编译完成的。
了解内核映像、内核模块等概念。还了解 initramfs 以及如何为您的特定内核手动生成 initramfs。
正如预期的那样,作者很好地向内核编程新手解释了这些概念。某些主题(例如 Linux 内核模块)仅特定于 Linux 内核。他以令人满意的方式涵盖了这些内容,为下一章做准备。
为 Linux 内核编写代码
一旦您对 Linux 内核源代码树和构建过程有了简要的了解,作者就会开始为 Linux 内核编写代码。强烈建议您在物理/虚拟机上构建和运行此“树外”代码。
为了让您为 Linux 内核编写代码,作者首先让您熟悉 Linux 内核的模块系统。涵盖以下主题:
了解编写简单 Linux 内核模块的所有要素。用户空间编程约定的“等效项”,例如内核代码中的
main()
函数(init()
和exit()
函数)。构建这些内核模块。装载和卸载它们。在哪里可以看到他们的输出。
当您有多个内核模块和源文件时的实验和方法。如何使一个源文件“依赖”另一个源文件?
我会再重复一遍。 请按照代码示例进行操作。它们是为了让您理解,并且很好地解释了当前的每个主题。
Linux 内核内部结构:概述
接下来,作者将概述 Linux 内核的内部结构。涵盖了内核开发人员必须了解的基本块,如下所示:
进程和线程。深入研究 Linux 的
task_struct
数据结构来跟踪进程。Linux 内核内存管理的内部结构。
内核模块的内存分配。
创建自定义的slab缓存。
内核的“内部”API,例如
kmalloc()
、kzalloc()
、kfree()
、vmalloc()
等。
作者还超越(在我看来)涵盖了一个必要但经常被忽视的功能:KASLR(内核地址空间布局随机化)。
本节最后通过了解 Linux 内核内存不足 (OOM) 杀手来结束。
Linux 内核内部结构:调度程序
一旦涵盖了您在操作系统课程中可能遇到的主题,作者就会涵盖现有每个操作系统的所有内核都涵盖的最后一个、最重要的任务:任务调度程序。
本节涵盖以下主题:
KSE 及其在 Linux 内核中调度任务的用途。
CFS 任务调度程序是 Linux 内核 v6.1.y 版本的一部分,也是本书的目标。
内核同步和技术:自旋锁、锁定等。
了解 Cgroup (v2)。
通过涵盖 Linux 内核调度程序的大部分内容,作者结束了本书。
书中我喜欢的东西
我强烈推荐这本书,因为它是一本与 Linux 内核源代码保持同步的优秀资源。
以下是我个人喜欢这本书的一些方面:
实践方法:本书重点关注大量代码,本书中的大部分文本(非代码)主要是解释代码、它的作用、可以做什么以及其他一些想法供您探索。
作业:这是对有关实践方法的第一点的补充。作者有一些有趣的作业,你至少应该尝试一下!
深入解释:几乎所有涵盖的主题都有很好的、深入的解释。那些没有的,鼓励您进一步探索。
技术含量高:本书很少关注通用操作系统基础知识——与典型的操作系统计算机科学课程书籍不同。相反,它直接深入探讨 Linux 内核中的内容是如何工作的。 (我个人更喜欢这个而不是通用的基础知识,因为你在已知的基础(Linux)上应用并立即看到结果。)
软件许可:虽然许多软件开发人员不必为软件许可而烦恼,但由于各种限制(讨论过),作为内核开发人员了解软件许可非常重要在书里)。这是一个很小但很重要的话题。
我希望这本书涵盖的内容
虽然这是一个很棒的资源,但没有什么是完美的,因此,我有一个很小的清单,其中列出了我希望看到的内容。
覆盖 VFS,以便更好地理解 Linux 内核代码库中包含的文件系统。
关于驱动程序开发的一小部分。让读者可以扩展到“核心”内核开发之外的其他领域。
包含一些 Rust 代码,但这只会随更高版本的内核版本一起提供,所以我愿意放弃这一点。
谁知道?如果您喜欢它并最终购买了这本书,作者可能会获得第三版的奖励!
结论
由 Kaiwan N. Billimoria 撰写的《Linux 内核编程》一书的第二版对于那些寻求一本可以帮助您开始 Linux 内核编程的书籍的人来说是一个极好的资源。它有很多帮助,理所当然,因为 Linux 内核是一个巨大的代码库。
我知道现在很多人更喜欢在线和视频内容来进行编程和其他技术相关的学习,但没有什么比一本好书更方便的了。您不仅可以按照自己的节奏学习,而且通过书籍重新审视某个主题比通过视频更容易。这句话出自一个 20 岁出头的人之口,所以这说明了很多事情。