您的位置首页生活百科

Linux内核应该怎么去学习?

Linux内核应该怎么去学习?

的有关信息介绍如下:

Linux内核应该怎么去学习?

可以尝试迭代螺旋法这种方式看看!

很多为Linux吐血而亡的程序员都犯了一个通病,那就是一开始就陷入无穷无尽的细节,比如一开始就陷入源代码情景分析。情景分析这样的书,无疑是好书,但是你把《新华字典》从第一个单词,背到最后一个单词,你仍然写不出一篇作文。

若言琴上有琴声,放在匣中何不鸣?

若言声在指头上,何不于君指上听?

《琴诗》

苏轼

我建议的学习方法是,反复迭代螺旋上升法。如下图:

下面我们来论述学习Linux内核的各个阶段

接下来怎么办?不停地循环!生命不息,循环不止!!两情若是久长时,又岂在朝朝暮暮。

你千万不要倒着学,先跑进去细节,跑进去一行行,总共2000万行地撸代码,这样量太大,整体性太弱,各个组件的关联很难建立。且中间无法用前期的成就感,来催生后期学习的动力,只会强撸灰飞烟灭。你不从外围看Linux,横着看,竖着看,你是看不到Linux的真面目的。

横看成岭侧成峰,远近高低各不同。

不识庐山真面目,只缘身在此山中。

据我个人所知,也有极少量的人,一开始就以情景分析的方法,逐行解释代码,最后也学有所成,但是这样的人,都具有非凡的毅力,不是一般人可以去模仿的。

一般的人,类似我这样的懒惰分子,需要用整体带动部分的方法。正如我们看一个别人的.c文件,你不可能傻到从第一行读到最后一行。你肯定是先搞清楚这个.c的整体功能,对外接口API,再深入到static的内部函数,由外及内,继而由内及外。

下面我们用一个球来比如Linux,最外圈的球是整体的Linux,球内的小球是Linux的某个组件。最开始你这样看Linux:

接下来你把其中的某些子系统放大,整个Linux这个气球也随着变大:

随着掌握的越多,这个球越来越大:

然后,某个领域成为你的专业领域(比如你文件系统牛逼,比如你内存优化牛逼),这个球里面这个专业领域就凸起了:

可以看看我们的精华文章

Linux任督二脉之进程管理

郭健: Linux进程调度技术的前世今生之“前世”

郭健: Linux进程调度技术的前世今生之“今生”

宋宝华: 是谁关闭了Linux抢占,而抢占又关闭了谁?

宋宝华:Linux的任督二脉——进程调度和内存管理

Linux任督二脉之内存管理

宋宝华: CPU是如何访问到内存的?--MMU最基本原理

宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清

宋宝华:网上坑爹的Linux资料汇总之内存管理

宋宝华:swappiness=0究竟意味着什么?

宋牧春: 多图详解Linux内存分配器slub

宋宝华: 用代码切身实践体会meltdown漏洞

宋牧春: Linux内核slab内存的越界检查——SLUB_DEBUG

郭健: Linux内存逆向映射(reverse mapping)技术的前世今生

谢宝友: 深入理解Linux RCU之一——从硬件说起

谢宝友:深入理解Linux RCU:从硬件说起之内存屏障

系统调试调优

宋宝华:关于Ftrace的一个完整案例

阿里杨勇:浅谈 Linux 高负载的系统化分析

宋宝华:火焰图:全局视野的Linux性能剖析

孟冉: Linux火焰图的数据流程分析

朱辉(茶水): Linux Kernel iowait 时间的代码原理

朴英敏: 用crash工具分析Linux内核死锁的一次实战

宋宝华: Kernel Oops和Panic是一回事吗?

廖威雄: 利用__attribute__((section()))构建初始化函数表与Linux内核init的实现

文件系统和IO

宋宝华: 文件读写(BIO)波澜壮阔的一生

黄伟亮:ext4文件系统之裸数据的分析实践

黄伟亮: 探秘Linux的块设备和根

吴锦华/明鑫: 用户态文件系统(FUSE)框架分析和实战

设备驱动

宋宝华:让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型

宋牧春: Linux设备树文件结构与解析深度分析(1)

宋牧春: Linux设备树文件结构与解析深度分析(2)

何晔: 当ZYNQ遇到Linux Userspace I/O(UIO)

云和虚拟化

宋宝华:Docker 最初的2小时(Docker从入门到入门)

宋宝华: KVM最初的2小时——KVM从入门到放弃

Linuxer人生

论一个程序员问问题的自我修养(修订版)

论程序员的时代焦虑与焦虑的缓解

陈莉君教授: 回望踏入Linux内核之旅

魏永明: MiniGUI的涅槃重生之路

谢宝友: 手把手教你给Linux内核发patch

(END)

更多精彩……欢迎关注微信公众号:linux阅码场(id: linuxdev)