klinux

linux 内核技术文档: klinux document

本文档记录有关操作系统内核的技术细节

写在前面

阅读内核代码的主要有三种人: reader writer hacker, 对不同的人有不同的含义,学习方法、侧重点、投入的精力也大不相同

内核的接口稳定,但具体实现变化快, 而且比较注重代码的通用性和复用性,要照顾那些虽然你用不到但少数人会用的需求(比如个人电脑几乎用不到但是服务器几乎必备的numa), 原本简单直接的做法上增加间接层, 反而加大了理解代码的负担, 很多时候函数指针回调函数传来传去, 没有 debugger 很难看清楚怎么调用的, 而且 kernel 加了 O2 优化 debugger 还不太好使

如果你本身就要从事内核开发,那么以上这些都不是问题.对于这用户态写server的人,学内核的目的是什么,学到的知识能不能/要不要/如何用到日常开发中,这是值得思考的.

阅读内核源码绝非彰显技术实力的勋章,而是解决特定问题的工具.如果您在用户态开发中从不需要处理千万级并发,没有遇到必须修改内核才能突破的性能瓶颈,或许把精力集中在应用层优化会是更务实的选择.技术学习最珍贵的不是知识的广度,而是对自身真实需求的清醒认知.希望每位开发者都能找到最适合自己的成长路径. 我并不赞成逢人就推荐阅读 Linux 内核源码, 希望读者在阅读本项目其他文章之前了解自己需要什么.

如何阅读 linux 内核代码

关于代码

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

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

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

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

关于笔记

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

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

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

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

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

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

参考

zood