Skip to content

Commit 55c2d4b

Browse files
feat: notes to submits and ready to setup building the repo
1 parent 2d0ab36 commit 55c2d4b

255 files changed

Lines changed: 56102 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ out/
44
compile_commands.json
55
.cache
66

7+
# TODO is private currently
8+
todo/
9+
710
# IDE
811
.vscode/
912
.idea/

.gitmodules

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
path = third_party/linux
33
url = https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
44
branch = linux-6.19.y
5+
ignore = dirty # Ignore Modifies, our scripts shell create something dirty!
56
[submodule "third_party/busybox"]
67
path = third_party/busybox
78
url = https://github.com/mirror/busybox.git
9+
ignore = dirty # Ignore Modifies, our scripts shell create something dirty!

document/notes/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Linux 内核学习笔记
2+
3+
这部分是笔者阅读 Linux 内核相关书籍时整理的笔记。为避免版权争议,内容已做笔记转教程的处理,仅作为学习参考。
4+
5+
## 目录结构
6+
7+
| 目录 | 内容 | 篇幅 |
8+
|------|------|------|
9+
| `linux_kernel_programming` | Linux 内核编程基础 — 从零搭建内核工作空间,涵盖模块开发、字符设备、进程调度等 | 13 章 |
10+
| `linux_kernel_device_drivers` | Linux 内核设备驱动 — 驱动模型、字符/块/网络设备驱动的编写与实践 | 22 篇 |
11+
| `linux_kernel_debugging` | Linux 内核调试 — 调试工具、崩溃分析、性能调优等排障技巧 | 93 篇 |
12+
| `linux_kernel_networking` | Linux 内核网络 — 网络协议栈源码剖析,从链路层到套接字层 | 124 篇 |
13+
14+
每个子目录下的文件按章节编号(如 `ch01.md``ch01_1.md`),可直接按顺序阅读。
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# 第 1 章
2+
3+
4+
本章共 10 节,点击下方链接阅读:
5+
6+
1. [Technical requirements](ch01_1.md)
7+
8+
2. [Software debugging – what it is, origins,
9+
and myths](ch01_2.md)
10+
11+
3. [Software bugs – a few actual cases](ch01_3.md)
12+
13+
4. [Setting up the workspace](ch01_4.md)
14+
15+
5. [A production and a debug kernel](ch01_5.md)
16+
17+
6. [Setting up our custom production kernel](ch01_6.md)
18+
19+
7. [Setting up our custom debug kernel](ch01_7.md)
20+
21+
8. [Seeing the difference – production and debug
22+
kernel config](ch01_8.md)
23+
24+
9. [Debugging – a few quick tips](ch01_9.md)
25+
26+
10. [Further reading](ch01_10.md)
27+
28+
29+
---
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 第 1 章 在底层失序的边缘
2+
3+
## 1.1 技术准备:搭建你的手术台
4+
5+
有一类问题,在应用层叫“异常”,到了内核里就叫“恐慌”。
6+
7+
在用户态写代码时,最坏的情况大不了程序崩溃,你会看到一条 Segmentation Fault,然后进程结束,系统依然运行。但在内核里,规则变了。没有谁来保护你,一旦指针乱飞,你面对的可能是整台机器的死锁、数据 silently 消失,或者那个著名的黑色开机画面(Kernel Panic)。
8+
9+
本章的任务,就是把你武装成一个能给内核做手术的医生。
10+
11+
但这需要工具。你不可能靠 printf 在内核里活着走出来——实际上,即便你能在早期的内核代码里用 `printk`,等你真正遇到并发竞态或者内存破坏时,单纯的日志往往只能告诉你“它挂了”,而不是“为什么挂”。
12+
13+
我们需要的是显微镜、是透视仪、是一个能让我们停下来观察系统每一个微小动作的环境。
14+
15+
这就是本章要建立的底层能力。
16+
17+
别被“内核调试”这几个字吓到了。很多人觉得这是内核黑客的禁地,实际上,只要环境搭对了,调试内核代码和调试普通 C 程序在操作上并没有天壤之别——区别只在于你需要更小心地踩在钢丝上。
18+
19+
准备好你的手术台。我们开始。
20+
21+
---
22+
23+
### 从零开始:硬件与系统准备
24+
25+
首先,你需要一台不算太旧的电脑。不管是桌面机还是笔记本,只要性能不要太古董就行。为了方便折腾,也为了不把自己的主力工作环境搞炸,我们强烈建议使用虚拟机作为“沙盒”。
26+
27+
**为什么要用虚拟机?**
28+
29+
因为内核调试是一个高风险活动。你肯定会写出把系统挂在半路上的代码。如果你在物理机上直接跑,一次死机可能意味着强制重启,甚至数据丢失。而在虚拟机里,哪怕内核彻底崩溃了,你的物理主机依然稳如泰山,大不了把这个虚拟机 snapshots 回滚一下,拍拍灰尘继续来。
30+
31+
这就是我们在本章即将反复用到的一个核心原则:**构建一个安全的、可随意破坏的环境。**
32+
33+
对于本书,我们将以 **Ubuntu 20.04 LTS** 运行在 **x86_64 架构****Oracle VirtualBox** 虚拟机作为标准操作平台。Ubuntu 官方给出了推荐的最低系统配置(比如内存、CPU 核心数等),在安装之前,建议你去官方文档(https://help.ubuntu.com/community/Installation/SystemRequirements)核对一下。
34+
35+
哪怕你是给虚拟机分配资源,也得确保这些“软指标”是达标的。毕竟,内核编译和调试工具链都是吃内存和 CPU 的怪兽。给少了,你会在这个过程里感到卡顿得令人绝望;给够了,体验会顺畅很多。
36+
37+
关于如何把 Linux 作为“客户机”安装在 VirtualBox 里的具体细节,我们会在后续的 **“在虚拟机中运行 Linux”** 一节里详细展开,现在先有个概念:我们要在一个虚拟的盒子里,模拟一台完整的 x86_64 电脑。
38+
39+
---
40+
41+
### 上号!获取本书源码
42+
43+
环境有了,接下来是代码。
44+
45+
本书的所有示例代码、实验脚本和配置文件,都已经托管在 GitHub 上了。这意味着你不需要从头敲每一个字符——虽然作为学习者,手敲一遍有它的价值,但在调试这种需要反复试错的场景里,一个能直接运行的基础代码库能帮你节省大把时间。
46+
47+
打开终端,输入下面的命令:
48+
49+
```bash
50+
git clone https://github.com/PacktPublishing/Linux-Kernel-Debugging
51+
```
52+
53+
这行命令会把整个代码仓库克隆到你的本地。
54+
55+
你可以顺着目录结构看进去:源码是按章节(chapter-wise)组织的。每一章都有自己独立的文件夹。
56+
57+
比如,你在仓库里会看到一个 `ch1/` 目录,里面装的就是本章要用到的所有素材和源代码。这种结构设计是有意为之的——它让你能清晰地隔离不同阶段的学习进度,也不会让代码像一团乱麻一样堆在一起。
58+
59+
⚠️ **注意**
60+
千万别把代码随手放在一个没有写权限或者容易被清理的地方(比如系统临时目录)。找一个你自己的 home 目录,建一个专门的 `workspace` 文件夹。这是做工程的好习惯,免得到最后找文件找得头皮发麻。
61+
62+
到这里,基础原料——操作系统环境和代码仓库——就位了。接下来,我们要真正开始打造这个“内核调试实验室”。这不仅仅是安装几个软件,更是在理解:**为什么我们需要一个特制的内核?** 为什么标准的生产环境内核对调试来说是不够用的?
63+
64+
这其中的奥妙,我们在下一节揭晓。

0 commit comments

Comments
 (0)