如何学习Linux内核

Linux学习是一个登山的过程,道路曲折,路径繁杂,但最终都会归结到内核。个人认为,越是底层的技术发展路径越稳定,只要有恒心和毅力,有无穷的探索可以让你乐此不疲。

就像Linus说的, Just for Fun

Linux系统编程

Linux系统编程指开发底层软件,例如存储或网络应用程序。

系统编程和大多数应用开发不同,包含了大量的OS和网络内容。你需要了解详细的 Linux Kernel Interface 。由于历史和性能原因,Linux系统编程通常需要掌握 C/C++ 以及由C提供的系统API。

系统编程需要gdb debugging技能,推荐参考书籍:

系统编程推荐书籍:

传统上系统编程需要深入学习C/C++,近年来技术发展新一代系统编程语言可以采用Rust/Python。不过,C/C++依然是主流。

需要学习非常广泛的知识领域, To Be A Great Programmer: Mindset And Learning Strategy 介绍了一些心得,也许你需要沉下心自我学习训练10年 - Peter Norvig: Teach Yourself Programming in Ten Years

内核开发

Linux内核包含了非常多的模块,例如内存管理,进程调度,虚拟内存,文件系统,设备驱动等等。

../../_images/linux-kernel-map.png

这么多内容对于内核开发初学者来说可能会感觉无从下手,所以你需要一个关于内核的全景指引:

其他有关内核开发的推荐书籍:

需要注意的是,Linux内核开发的领域太多了,对于初学者不可能同时学习所有领域,所以学习的策略是:

  • 首先获得Linux内核的概况,推荐上文介绍的 Robot Love 撰写的 Linux Kernel Development

  • 另一种可行的方法是学习旧版本Linux,这是因为旧版本代码较少,可以较快完成学习。

  • xv6 是另外一种学习方法,采用简化的UNIX教学操作系统,是MIT操作系统课程 6.828: Operating System Engineering 的教学用软件。并且提供了 6.828: Operating System Engineering学习阅读资料

  • 你应该集中精力先学习一个感兴趣的子系统,理解原理并尝试设计。尝试加入内核开发社区,阅读 Kernel Howto文档 ,加入 Linux邮件列表 ,review其他人的补丁并尝试自己提交补丁。Linux内核社区由自己的写作方式,需要学习规则。当你的第一个补丁被接受,这将是一个巨大的里程碑。此外,当你具备了某个内核子系统的足够知识和技能,就会非常容易转换到另一个子系统。

你需要花费很多年来掌握内核编程,所以 happy hacking, and have fun

备注

很遗憾,国内没有引进 Linux Kernel Development ,请参考 Linux.Kernel.Development.3rd.Edition.pdf

代码注释、调试和参与社区

学习内核代码是一个漫长的过程,系统越来越复杂和庞大。老内核开发和新加入的开发之间存在不同的知识边界,相互间存在 代沟 。解决的方法可能是:

  • 保持代码清晰:明确的接口,稳定的设计,以及 “只做一件事,将事情做好” (Linus Torvald的解决方案)

  • 代码注释是开发者和后来维护者的沟通途径,你需要理解设计和实现之间的差异(也就是debuging),你通过修改内核代码来能够理解内核设计,并且远比仅仅阅读代码要理解得更为深刻

  • 加入内核开发邮件列表并和其他开发者互动,这会促使你和其他开发者共同进步

参考