klinux

学习 Linux 内核,是一场没有终点的旅程。它不会带来“速成”的喜悦,但会让你学会直面复杂,沉下心来,用代码去理解这个世界的底层逻辑。

很多人一开始都想“系统性地学内核”,但内核不像一本教科书,它是一棵枝叶繁茂、错综复杂的大树。与其试图把整棵树画在纸上,不如从一个个你真实遇到的问题出发:

内核的真相永远藏在代码和运行时的行为里,而不是一张张 PPT 上。

亲自动手,比盯着 IDE 更重要。内核学习不是看教程、敲 demo,而是跟真实机器打交道:

当你开始觉得“内核好像也没那么难”,其实是到了一个该突破的阶段:

你真正要战胜的,并不是代码,而是对未知的畏惧。

三十多年前,Linus Torvalds 在赫尔辛基的一个房间里写下了 Linux 的第一行代码,他并没有一个伟大的计划,只是出于兴趣,想造点什么。当你能看着 schedule() 会心一笑,当你能大致说出 read/write 究竟做了什么,当你开始关注内核邮件列表里的 patch 而不是教程——你已经在路上了。

一句赠言:

内核这条路确实难走,但也正因为它难,才值得你去走。找到你真正关心的那个方向——无论是网络、文件系统、安全、虚拟化,还是嵌入式、调度器……只要坚持深耕,总有一天,你会成为那个解决别人解决不了问题的人。愿你保持热情、保持探索、保持自信。

—— 来自一位仍在探索中的内核学习者

关于本文

TODO: 这部分尚未完工...

本项目的代码基于 linux v6.6, 并没有大刀阔斧的改动原本的内核源码树, 只是在一些地方加入了注释便于笔者自己阅读理解

同时本项目也包含对于内核代码大刀阔斧的修改, 以如下两种方式

关于每个模块代码和patch代码的作用详见 modules/README.md 和 patches/README.md, 所有代码修改都会对应一个实验文档

关于笔记

本文档主要是笔者自己学习内核过程中记录的内容, 以供日后的查阅和理解. 文中表述会尽量正式, 避免口语化. 如果读者发现有不妥之处, 欢迎反馈

文中会出现几种特殊的注释风格

[!NOTE] NOTE
为笔者标注的笔记内容, 用于阅读时的参考补充

[!TIP] TIP
为笔者遇到并成功解决的一些小坑, 记录在案以备后续查阅

颜色鲜艳的注释很亮眼, 但是我不并喜欢频繁的使用这种夸张的注释, 显得文档一片红一片蓝反倒没有重点. 文中内容仍然是以文字辅助图片说明为主, 只有在一些重点的地方才会以这种彩色注释标注

参考

所谓站在巨人的肩膀上可以看得更远, 本系列当然不是笔者顿悟而出, 事实上很多文字都是整合诸多前辈文章中内容并重新组织语言凝炼而成, 参考了很多大佬的文章/博客/代码, 本系列文章参考众多, 下面只列出一些系列的参考资料, 每一篇文章的相关的参考都会标注在对应文末, 感兴趣的读者可以自行阅读

zood