## File: README.md # Linux 内核揭秘 本仓库包含一本关于 Linux 内核及其内在机理的在编书籍,是 [linux-insides](https://github.com/0xAX/linux-insides) 的中文翻译版本。 **目的很简单** - 分享 Linux 内核内部原理及相关底层主题的知识。如果你想了解 Linux 内核的底层运作,请查阅[目录](https://github.com/hust-open-atom-club/linux-insides-zh/blob/master/SUMMARY.md)。 **问题/建议**: 如有相关问题或建议,请提交 issue。一方面,对于英文原文问题,请在上游仓库 - [linux-insides](https://github.com/0xAX/linux-insides) 中提交 issue;另一方面,对于中文翻译问题,请在下游仓库 - [linux-insides-zh](https://github.com/hust-open-atom-club/linux-insides-zh) 中提交 issue。 ## 前置要求 - 熟悉[汇编语言](https://zh.wikipedia.org/wiki/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80) - 熟练掌握 [C 语言](https://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80) - 此外,[Intel 软件开发者手册](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html)中有大量关于 x86_64 处理器的参考资料 ## 贡献 如有相关问题或建议,请不吝指教,提交 issues 或者 PRs。对于 `linux-insides-zh` 翻译项目,请通过以下方法进行贡献: - 将英文原文翻译为中文(目前只提供简体中文的译文); - 同步尚未翻译的英文原文至本项目; - 根据上游英文的更新,检查并更新已有的中文译文; - 校对已翻译的中文译文,包括修正错别字、润色等; 目前本项目的**翻译进度**与**翻译认领规则**,请查看 [TRANSLATION_STATUS.md](TRANSLATION_STATUS.md)。 在开始翻译之前,请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 与 [TRANSLATION_NOTES.md](TRANSLATION_NOTES.md)。关于翻译约定的任何问题或建议,同样请提交 issue 讨论。 ## 使用 mdBook 构建 仓库已经支持直接使用 `mdBook` 构建网页书籍,同时支持生成 PDF 和 EPUB。 安装: ```bash cargo install mdbook mdbook-pdf mdbook-epub --locked ``` 构建: ```bash mdbook build ``` 本地预览: ```bash mdbook serve --open ``` 生成结果位于 `book/` 目录: - HTML:`book/html/` - PDF:`book/pdf/output.pdf` - EPUB:`book/epub/Linux 内核揭秘.epub` 仓库同时提供了 GitHub Actions 工作流,在 `master` 分支更新后自动构建并部署 GitHub Pages。 ## 邮件列表 我们开源俱乐部有一个 [Google Group 邮件列表](https://groups.google.com/g/hust-os-kernel-patches)用于学习和贡献 Linux 内核源码。 **加入方式:** 发送任意邮件到 `hust-os-kernel-patches+subscribe@googlegroups.com`,收到确认邮件后即可加入。 > [!TIP] > 如果你有谷歌账号,可以直接通过[归档页面](https://groups.google.com/g/hust-os-kernel-patches)申请加入。 ## 维护者与作者 - 原文作者:[@0xAX](https://x.com/0xAX) - 中文维护者:[@mudongliang](https://github.com/mudongliang)、[@xinqiu](https://github.com/xinqiu) - 中文贡献者:详见 [CONTRIBUTORS.md](CONTRIBUTORS.md) ## 许可证 本项目使用 [BY-NC-SA Creative Commons](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可证。 --- ## File: Concepts/README.md # Linux 内核概念 本章描述内核中使用到的各种各样的概念。 * [每个 CPU 的变量](linux-cpu-1.md) * [CPU 掩码](linux-cpu-2.md) * [initcall 机制](linux-cpu-3.md) * [Linux 内核的通知链](linux-cpu-4.md) --- ## File: Booting/README.md # 内核引导过程 欢迎来到 Linux 内核的引导之旅。本章一步步讲述了从你开机那一刻起,到 Linux 内核加载到您机器的内存中时,完整的启动阶段。 ## 阅读方法 本章假设你熟悉基础计算机架构,并对 `C` 语言和 `x86_64` 汇编语法略有了解。你不需要成为内核专家,但读懂短代码片段和识别硬件术语会对阅读本章很有帮助。 本章的每一部分都聚焦于一个启动阶段。第一次按顺序阅读,然后,在想将特定符号或寄存器映射到序列中的位置时,作为参考点,逐步回顾。在本地电脑上拥有 Linux 内核的源代码,有助于了解细节。您可以使用以下命令获取源代码: ```bash git clone git@github.com:torvalds/linux.git ``` ## 术语表 在阅读本章及其他章节时,你可能会遇到一些专业术语: - `CS`, `DS`, `SS`, `CR0`, `CR3`, `CR4`, `EFER` - 代表 x86 段寄存器和控制寄存器 - `0x...` - 表示十六进制值 - `entry_*` 和 `startup_*` - 是早期引导符号的常见前缀 - `setup code` 指的是 Linux 内核的早期部分,用于执行将内核代码本身加载到内存的准备工作 - `decompressor` 指的是将压缩后的内核映像解压到内存的 `setup code` 部分。 ## 你将学到什么 - 处理器从固件和引导加载程序到达内核入口点的方式 - x86_64 处理器的不同模式 - 内核本身之前的早期 `setup code` 会被加载到内存中并开始工作 ## 阅读顺序 * [从引导程序到内核](linux-bootstrap-1.md) - 介绍了从开机到内核执行第一条指令之前的所有阶段; * [在内核设置代码的第一步](linux-bootstrap-2.md) - 介绍了在内核设置代码的第一个步骤。你会看到堆的初始化,查询不同的参数,如 EDD,IST 等... * [视频模式初始化和保护模式切换](linux-bootstrap-3.md) - 介绍了内核设置代码中的视频模式初始化,并切换到保护模式。 * [切换 64 位模式](linux-bootstrap-4.md) - 介绍切换到 64 位模式的准备工作以及切换的细节。 * [内核解压缩](linux-bootstrap-5.md) - 介绍了内核解压缩之前的准备工作以及直接解压缩的细节。 * [内核地址随机化](linux-bootstrap-6.md) - 介绍了 Linux 内核加载地址随机化的细节。 ## 内核版本 本章对应 `Linux kernel v6.19`。 --- ## File: DataStructures/README.md Linux内核中的数据结构 ======================================================================== Linux内核对很多数据结构提供不同的实现方法,比如,双向链表,B+树,具有优先级的堆等等。 这部分考虑这些数据结构和算法。 * [双向链表](linux-datastructures-1.md) * [基数树](linux-datastructures-2.md) * [位数组](linux-datastructures-3.md) --- ## File: Initialization/README.md # 内核初始化流程 读者在这章可以了解到整个内核初始化的完整周期,从内核解压之后的第一步到内核自身运行的第一个进程。 *注意* 这里不是所有内核初始化步骤的介绍。这里只有通用的内核内容,不会涉及到中断控制、 ACPI 、以及其它部分。此处没有详述的部分,会在其它章节中描述。 * [内核解压之后的首要步骤](linux-initialization-1.md) - 描述内核中的首要步骤。 * [早期的中断和异常控制](linux-initialization-2.md) - 描述了早期的中断初始化和早期的缺页处理函数。 * [在到达内核入口之前最后的准备](linux-initialization-3.md) - 描述了在调用 start_kernel 之前最后的准备工作。 * [内核入口点](linux-initialization-4.md) - 描述了内核通用代码中初始化的第一步。 * [体系架构初始化](linux-initialization-5.md) - 描述了特定架构的初始化。 * [进一步初始化指定体系架构](linux-initialization-6.md) - 描述了再一次的指定架构初始化流程。 * [最后对指定体系架构初始化](linux-initialization-7.md) - 描述了指定架构初始化流程的结尾。 * [调度器初始化](linux-initialization-8.md) - 描述了调度初始化之前的准备工作,以及调度初始化。 * [RCU 初始化](linux-initialization-9.md) - 描述了 RCU 的初始化。 * [初始化结束](linux-initialization-10.md) - Linux内核初始化的最后部分。 --- ## File: Interrupts/README.md # 中断和中断处理 在 linux 内核中你会发现很多关于中断和异常处理的话题 * [中断和中断处理第一部分](linux-interrupts-1.md) - 描述中断处理主题 * [深入 Linux 内核中的中断](linux-interrupts-2.md) - 这部分开始描述和初步步骤相关的中断和异常处理。 * [初步中断处理](linux-interrupts-3.md) - 描述初步中断处理。 * [中断处理](linux-interrupts-4.md) - fourth part describes first non-early interrupt handlers. * [异常处理的实现](linux-interrupts-5.md) - 一些异常处理的实现,比如双重错误、除零等等。 * [处理不可屏蔽中断](linux-interrupts-6.md) - 描述了如何处理不可屏蔽的中断和剩下的一些与特定架构相关的中断。 * [深入外部硬件中断](linux-interrupts-7.md) - 这部分讲述了关于处理外部硬件中断的一些早期初始化代码。 * [IRQs的非早期初始化](linux-interrupts-8.md) - 这部分讲述了处理外部硬件中断的非早期初始化代码。 * [Softirq, Tasklets and Workqueues](linux-interrupts-9.md) - 这部分讲述了softirqs、tasklets 和 workqueues 的内容。 * [最后一部分](linux-interrupts-10.md) - 这是中断和中断处理的最后一部分,并且我们将会看到一个真实的硬件驱动和中断。 --- ## File: KernelStructures/README.md # Linux 内核内部`系统`数据结构 这不是 `linux-insides-zh` 中的一般章节。正如你从题目中理解到的,它主要描述 Linux 内核中的内部`系统`数据结构。比如说,中断描述符表 (`Interrupt Descriptor Table`), 全局描述符表 (`Global Descriptor Table`) 。 大部分信息来自于 [Intel](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) 和 [AMD](http://developer.amd.com/resources/developer-guides-manuals/) 官方手册。 --- ## File: MM/README.md # Linux 内核内存管理 本章描述 Linux 内核中的内存管理。在本章中你会看到一系列描述 Linux 内核内存管理框架的不同部分的帖子。 * [内存块](linux-mm-1.md) - 描述早期的 `memblock` 分配器。 * [固定映射地址和 ioremap](linux-mm-2.md) - 描述固定映射的地址和早期的 `ioremap` 。 * [kmemcheck](linux-mm-3.md) - 第三部分描述 `kmemcheck` 工具。