本文档主要是笔者自己学习内核过程中记录的内容, 以供日后的查阅和理解. 文中表述会尽量正式, 避免口语化. 如果读者发现有不妥之处, 欢迎反馈
本项目的代码 fork 自 linux v6.6, 并没有大刀阔斧的改动原本的内核源码树, 只是在一些地方加入了注释便于笔者学习理解
文中会出现几种特殊的注释风格
为笔者标注的笔记内容, 用于阅读时的参考补充NOTE
为笔者遇到并成功解决的一些小坑, 记录在案以备后续查阅TIP
颜色鲜艳的注释很亮眼, 但是我不并喜欢频繁的使用这种夸张的注释, 显得文档一片红一片蓝反倒没有重点. 文中内容仍然是以文字辅助图片说明为主, 只有在一些重点的地方才会以这种彩色注释标注
本地浏览文档可以使用
pip install zood
zood -o
本项目文档相关衍生代码众多,大体可以分为四个部分
内核模块可以在内核外编写, 并动态装载到内核中, 非侵入式的方式不需要修改内核源码树,同时了解一下 linux 相关 api 的使用
如果想要实现一些特殊的功能需要对内核做比较底层的修改, 没有办法或者很难通过编写内核模块完成, 因此需要直接修改内核源码树. 很多初学者在一开始对 Linux 源码带有敬畏的感觉, 不敢改动代码, 相信经过一段时间的学习读者可以逐渐理解, 熟悉, 并主动尝试修改内核代码完成自己想要的功能.
linux 和 libc(如glibc) 提供了相关的系统编程接口,大部分系统编程任务都是通过底层调用相关接口完成的,这部分代码往往聚焦实现一些小功能,简单的代码片段测试,精心构造对应场景配合调试工具学习内核处理流程
所谓站在巨人的肩膀上可以看得更远, 本系列当然不是笔者顿悟而出, 事实上很多文字都是整合诸多前辈文章中内容并重新组织语言凝炼而成, 参考了很多大佬的文章/博客/代码, 本系列文章参考众多, 下面只列出一些系列的参考资料, 每一篇文章的相关的参考都会标注在对应文末, 感兴趣的读者可以自行阅读
学习 Linux 内核,是一场没有终点的旅程。它不会带来“速成”的喜悦,但会让你学会直面复杂,沉下心来,用代码去理解这个世界的底层逻辑。
很多人一开始都想“系统性地学内核”,但内核不像一本教科书,它是一棵枝叶繁茂、错综复杂的大树。与其试图把整棵树画在纸上,不如从一个个你真实遇到的问题出发:
fork()
究竟是怎么复制进程的,ext4
是怎么管理文件的。task_struct
。内核的真相永远藏在代码和运行时的行为里,而不是一张张 PPT 上。
亲自动手,比盯着 IDE 更重要。内核学习不是看教程、敲 demo,而是跟真实机器打交道:
drivers/
目录里到处是“现实妥协”的产物,理解这些代码的“为什么”,比评价它的“好坏”更有价值。当你开始觉得“内核好像也没那么难”,其实是到了一个该突破的阶段: