# 0. Linux核心概念详解

操作系统是软件世界的根基，其屏蔽了硬件世界，并为应用程序创造了一个执行环境；Linux是当前最流行的服务器端操作系统，本文将尝试着深入 Linux 内核代码，详细探讨一些核心概念的实现方式，以及其构建出来的抽象模型。

## 规划章节

笔者初步规划的章节如下：

1. 调试环境  - *Done*\
   本章介绍如何基于Docker构建内核的编译、运行、以及调试环境，并简要介绍如何基于GDB对内核代码进行调试。
2. 调度器 - *Done*\
   本章简要介绍了调度器的发展历史，深入探讨了不同调度类m并详细分析了CFS的实现，除此之外，还讨论了Linux如何实现组调度、负载追踪与负载均衡等话题。
3. 内存管理 - *Ongoing*\
   本章将详细介绍Linux的内存模型，以及内存管理的方方面面，包括内存分配与释放、Buddy System、SLAB/SLUB/SLOB、虚拟内存等方面。
4. 同步机制 - *TODO*
5. 中断与异常 - *TODO*
6. 容器基础：Cgroups与Namespace - *TODO*

各个章节的内容会滚动发布，将来也可能规划更多内容。

## 如何阅读 <a href="#orgca7081c" id="orgca7081c"></a>

Linux博大精深，整个内核代码非常庞大，一个人穷尽一生可能也无法精通内核的所有方面；虽然本文主要围绕着Linux的源代码展开，但文中也只是提取了重要代码的核心部分，旨在对系统核心的概念和模型进行讲解。

笔者强烈建议读者配合源代码阅读本文，本文使用的内核版本在第一章[调试环境](https://s3.shizhz.me/s3e1)有详细介绍，如果在探讨某些话题时涉及到其它历史版本的话，对应的章节都会做特别的说明，读者可以自行下载。

文中笔者没有对任何操作系统的理论性知识做任何探讨，这方面的资料汗牛充栋，如果读者想要了解可以自行找一些经典书籍进行阅读，例如[Operating System Concepts](https://www.os-book.com/OS10/) 与 [Operating System: Three Easy Pieces](https://pages.cs.wisc.edu/~remzi/OSTEP/) 都是很好的入门资料，笔者强烈推荐后者。

## 参考资料

在整理本文的过程中，笔者参考了大量的其它资料来辅助阅读内核源码。可以说没有这些资料的帮助，笔者本人可能完全无法从代码层面上理解内核的实现原。零散的参考资料在对应的章节都有记录，这里对主要的资料来源做一个整理，以便读者参考：

* <https://www.kernel.org/doc/html/latest/index.html>\
  Linux官网资料永远应该是第一个查阅的地方。
* <https://lwn.net/>\
  该站点的很多文章包含了特定主题的详细讲解，质量都非常高。
* <http://www.wowotech.net/>\
  每篇文章都很硬核，而且是中文哦！

除了以上的在线内容，笔者还着重参考了如下书籍：

* 《Understanding the Linux Kernel》
* 《Professional Linux kernel architecture》
* 《Linux Kernel Development》
* 《Understanding the Linux Virtual Memory Manager》

但需要注意的一点是这些书籍所基于的代码版本都是2.6的，读者可以着重参考书中对高层架构的讨论，具体的实现细节需要以最新的代码为准。
