Linux内核源码分析的正确姿势


有知乎网友在看Linux源代码,提了一些问题,勾起了我当年看内核源码的一些美好回忆。虽然尘封多年,但一些细节还是记忆犹新的。

初次观看Linux内核源码,看看了让人发懵!上图!图一的C语言代码预处理看的头皮发麻!后面代码能看懂。图二的汇编代码更上头!前辈都是这么放荡不羁的吗?看Linux内核源代码各位有什么好的建议?

稍微说下我的经验吧。我个人是计算机科学与技术科班出身的,毕业多年,当年也非常沉迷于内核相关的技术。为了证明真实性,我后面推荐的书的图片都会以知乎这个问题作为背景拍摄,除了《操作系统设计与实现》不知道放哪了,只能网上找个来代替。

首先,你需要看懂内核源码,你先是需要两个语言基础,一个是C语言的基础,这是众所周知没有什么好说的了。其次就是汇编,如果我记得没错的话,Linux内核中好几个地方是需要用到汇编的:

  • 第一,引导部分。引导程序必须是放在MBR中的,即第一个磁盘扇区(512字节),里面包含了怎么分段分页设置IDT,GDT,LDT等,直到怎么跳进init的main函数,所以必须非常精悍,所以估计是因为空间效率的原因,这部分需要用汇编来写
  • 第二,一些直接与硬件打交道的代码,估计是为了运行效率或者说C语言无法处理的地方
  • 第三,另外一些内核中被频繁调用的函数等,为了效率问题也会用汇编来写
  • 第四,其他?不记得了
    但是总得来说汇编的部分代码不是很多,如果你不是很关心相关部分的,其实你跳过去也没有关系。因为有些东西其实你看教程的文字,理解是怎么回事就好了。

如果你是想往这一块钻研的,那么我会推荐你看下图这个教程。不过我不知道现在还有没有得卖,也不知道是否还有更好的,但是我们那时候用这个的话挺好的,如果你有耐心看得话,问题应该不大。

有了语言的基础之后,我会建议你先不要直接看Linux的源码,因为你现在还没有操作系统怎么实现的理论基础。这个时候我建议你先去看最开始说不知道放哪里去的《操作系统设计与实现》。

ps: 这本书没找到着实可惜,里面都是我满满的注释和回忆

这本书是基于minix操作系统写的,是我们当时的教程,分上下两册,据说国外大学也是拿这套书作为教程的。这是一个微内核的操作系统,据说当时Linus编写linux的时候就是因为上了这个课还是看了这个书来着,觉得不够通用,然后自己去写了个宏内核的linux。后来还和本书的作者有过一场争吵和辩论。这些自己可以去google一下,当是增长见闻吧。

这本书上册是操作系统原理的描述,下册是对应章节的代码的实现,两者是搭配着看的。然后我们那时候是附送光盘的,里面有minix操作系统,你可以通过命令行启动进去就能自己进行修改和体验,好像里面还有汇编编译器nasm等吧。

等看完这两本书了,你基本上对操作系统怎么实现的就有个很好的理解了,什么内存管理分段分页段描述符,CPU调度,中断处理,文件系统,各种寄存器的作用,实模式保护模式的区别,进程的本质等等,你都会接触到并知道代码在minix是怎么实现的。

完了之后,下一本书我建议你去看的是《自己动手实现操作系统》,我也不知道现在是否还能买到,你自己尝试下吧。这本书的好处是用来巩固我们上面学习到的《操作系统设计与实现》的知识,作者教你如何从些引导程序,操作GDT等开始,一步步的引导你自己动手去编写出一个操作系统出来,当然,我当时看的时候这本书还没有完全实现一个完整的操作系统的,但是里面很多知识对我们加深对操作系统的了解已经非常有用了,这也是我们实操的很好的机会。

最后,我才建议去看Linux内核的代码,因为这个时候你操作系统的基础已经打得差不多了。我那个年代看的是《Linux内核情景分析》这一套书。非常厚,但是和一般的内核书籍有区别的是,它会如书名一样,根据某一个实际的场景,比如我们应用的一个读文件api从上层到内核最底层直到磁盘驱动是怎么实现的,一步步的给你分析清楚,这个就非常有针对性,学起来也很有意思。

以上就是一个老程序员对怎么去看Linux内核的一些建议吧,虽然内核相关知识我已经尘封多年了,但是我还是很希望我自己的一些经历或者说经验吧,能给后来者一些帮助,让大家少走弯路。

最后谢谢大家的观看吧,觉得写得还可以的点个赞转发下之类的,觉得写得不好的,请多多包涵吧。

我的更多作品
[三日清单] - 把握今天,放眼未来
[好学街] - 记录学习点滴、分享才艺人生
[techgogogo] - 本站公众号、关注了不迷路