Linux内核编程——快速介绍

348 阅读7分钟

您好,欢迎阅读本书,学习Linux内核编程!本书现已进入第二版,专门为帮助您以实践为导向的方式学习Linux内核开发而编写,同时提供必要的理论背景,以使您对这个广阔而有趣的主题有一个全面的了解。本书特别聚焦于通过强大的可加载内核模块(LKM)框架进行内核开发。这是因为许多现实世界中的项目和产品,特别是涉及内核功能和/或设备驱动程序开发的项目,都是以这种方式进行的。

本书的重点是实际操作和对Linux操作系统内部机制的深刻理解。在此方面,我们涵盖了从源码构建Linux内核到理解和处理内核中的复杂主题(如同步机制)的全过程。

为了引导您踏上这段激动人心的旅程,我们将本书分为三个部分。第一部分介绍了为内核开发设置适当工作环境的基础知识,构建现代内核以及编写您的第一个内核模块。

第二部分是关键部分,帮助您理解内核内部的基本细节。这部分内容包括Linux内核架构、任务结构、用户模式和内核模式堆栈,以及内存管理。内存管理是一个关键而有趣的主题,我们用整整三章的篇幅来讨论它(涵盖了内部机制以及如何高效地分配和释放内核内存)。这一部分还深入探讨了Linux操作系统中CPU(任务)调度的内部工作原理。

本书的最后一部分涉及更高级的内核同步话题——这是在Linux内核上进行专业设计和编码的必备知识。我们用两章的篇幅来讨论这一领域的关键话题。

本书使用的是内核社区的6.1长期支持(LTS)Linux内核。该内核将从2022年12月到2026年12月持续维护(包括漏洞修复和安全更新)。此外,民用基础设施项目(CIP)已将6.1版作为超级长期支持(SLTS)版本,并计划维护10年,直到2033年8月。这一点确保了本书的内容在未来几年内仍然具有现实意义和有效性。

我们非常强调实践操作,本书的GitHub仓库中提供了约40个内核模块(以及数个用户应用程序和Shell脚本,比第一版增加了一倍!),使学习过程更加生动、有趣、实用和有价值。(链接:github.com/PacktPublis…

我们强烈建议您同时参考本书的配套指南《Linux Kernel Programming Part 2——字符设备驱动和内核同步:创建用户-内核接口,处理外设I/O,并处理硬件中断》。这是一本极具行业实用性的初学者指南,涵盖了如何编写杂项字符驱动程序、对外设芯片内存进行I/O操作以及处理硬件中断。您可以随纸质版免费获得电子书版本,或者在本书的GitHub仓库中找到该电子书:github.com/PacktPublis…

我们真心希望您能从本书中学到知识并享受其中的乐趣。好了,现在让我们进入正题,学习如何设置合适的内核工作环境,以便通过一些实用的动手环节,从本书中获得最大收益。

内核工作空间设置

为了最大限度地利用本书的内容,首先设置好我们将在整个书中使用的工作空间环境是非常重要的。本章将详细教您如何完成这一设置并开始使用。

考虑到篇幅限制,本章的完整增强内容可以在本书的GitHub仓库中找到,链接如下:www.packtpub.com/sites/defau…。建议您下载并完整阅读。以下内容是我们第一章的介绍部分。感谢您的理解!

在本章中,我们将安装一个最新的Linux发行版(或“发行版”)作为虚拟机(VM),并设置所有必需的软件包。我们还将通过GitHub仓库克隆本书的代码。此外,本章还介绍了一些有用的项目,这些项目将帮助您在这段激动人心的Linux内核之旅中取得进展。

首先,我想强调的是,学习的最佳方式是通过经验和实践,亲自动手,不盲从他人的言论,而是自己尝试并亲身体验。因此,本书提供了许多动手实验和内核代码示例,您可以并且必须亲自尝试。这将极大地帮助您取得实质性进展,深入学习并理解Linux内核和驱动程序开发的各个方面。所以,请记住: 务必注重实践!同时,要勇敢、大胆,敢于尝试!

我们将在本章详细介绍以下主题,这些主题将帮助您设置工作环境:

  • 在虚拟机中运行Linux
  • 安装x86_64架构的Linux虚拟机
  • 其他有用的项目

技术要求

您需要一台现代且最好性能强大的台式电脑或笔记本电脑。Ubuntu Desktop在此处提供了安装和使用该发行版的一些推荐最低系统要求:help.ubuntu.com/community/I…。我强烈建议您选择一个远超最低推荐配置的系统——尽可能使用您能负担得起的最强大系统。这是因为执行诸如从源码构建Linux内核等任务是一个非常消耗内存和CPU的过程。显而易见,主机系统的RAM、CPU性能和磁盘空间越多越好!

像任何经验丰富的内核开发人员一样,我会说在原生Linux系统上工作是最好的。然而,对于本书而言,我们不能假设您始终有一个专用的原生Linux设备可用。因此,我们将假定您在一个Linux虚拟机上工作。在虚拟机中工作还增加了一层隔离性,从而提高了安全性。当然,缺点是性能;在高配置的原生Linux设备上工作,速度可能是虚拟机的两倍之多!

克隆本书的代码仓库

本书的完整源代码可在GitHub上免费获取,链接为:github.com/PacktPublis…。您可以通过克隆git树来克隆并使用这些代码,如下所示:

git clone https://github.com/PacktPublishing/Linux-Kernel-Programming_2E

源代码是按章节组织的。每个章节都有一个对应的目录,例如,ch1/目录中包含了本章的源代码。源码树的根目录下有一些所有章节共用的代码,例如convenient.hklib.c源文件等。

为了更高效地浏览代码,我强烈建议您始终使用ctags和/或cscope来为代码库创建索引。例如,要在源码树上设置ctags索引,只需进入源码树的根目录并输入ctags -R即可。(如果您还没有使用这些工具,请花时间学习像cscopectags这样的代码浏览工具。)

好了,现在我将交给您去下载并阅读本书的完整第一章(从其GitHub仓库中获取),然后按照其中描述的步骤进行内核工作空间的设置。

一旦完成这些操作,我将假设您已经为接下来的章节准备好了工作环境。太棒了!接下来,让我们继续前行,探索Linux内核开发的勇敢新世界;您的内核之旅即将开始!接下来的两章将教您如何从源码下载、提取、配置和构建Linux内核。

在 Discord 上了解更多

要加入本书的 Discord 社区——在那里您可以分享反馈、向作者提问并了解新版本的发布——请扫描以下二维码:
packt.link/SecNet

image.png