前言
2013年11月,我加入Intel,开始创作本书,最初决定在3.10版本的内核基础上写作,转眼间多年已逝,内核版本已经更新到5.x,本书也随之更新至5.05版本。少数讨论也涉及3.10版本的内容,保留它们主要是希望可以让读者看到内核的更新和优化思路。建议读者在阅读本书时,可以下载3.10和5.05两个版本的内核代码作为参考。
内容
本书分为以下五个部分。
知识储备篇:包括常见的数据结构、时间、中断处理和内核同步等内容,是后面几部分内容的学习基础,希望读者能够从中了解内核的概况,在后续章节中见到相关知识时不会感觉陌生。尤其是2.1关系型数据结构一节,它是理解其他章节数据结构间关系的基础。
内存管理篇:包括内存寻址、物理内存和线性内存空间的管理以及缺页异常等内容。希望读者能够从中学习到内存映射的原理,理解管理内存的过程,在调用内核提供的函数时能够明白内核为用户做了哪些操作。
文件系统篇:包括VFS的流程,sysfs、proc和devtmpfs文件系统的实现,ext4文件系统的解析。希望读者能够掌握文件系统的流程、文件操作的实现、sysfs等文件系统的特点以及ext4文件系统的原理。尤其是ext4文件系统,本书列举了大量的实操案例,希望读者可以理解它的精髓。
进程管理篇:包括进程原理、进程调度、信号处理、进程通信和程序执行等内容,希望读者能够掌握进程间的关系、进程调度的过程、进程通信的原理、信号的处理过程等。理解进程的创建过程尤为重要,它涵盖了进程实现的原理。
升华篇:包括I/O多路复用、input子系统、V4L2架构、Linux设备驱动模型、Binder通信和驱动的实现等内容。升华篇综合了前几部分的知识,希望读者可以掌握它们的原理,使用起来得心应手。
从难易程度来讲,这五部分内容是由浅入深的。本书仅罗列了关键或者复杂的代码,从它们包含的代码就可以得知难易程度。知识储备篇偏向工具和基础知识,以原理分析为主。内存管理、文件系统和进程管理篇是重心,代码量最大,这些代码一方面可以帮助读者理清整体的软件架构,另一方面方便读者在学习的时候不会因为手头没有代码而感到无从下手,最重要的是代码才是结论背后的真相,直接给出结论让技术变成了死记硬背的工具岂不无趣。
致谢
感谢我的研究生导师芦鹏宇,芦老师待人平和耐心,工作一丝不苟,帮助我在校时就树立了正确的做人和做事的方向。芦老师对技术不懈追求的态度,在我毕业时就已经深深烙在心里,并且始终影响着我。感谢芦老师,感谢“规格严格,功夫到家”的哈尔滨工业大学。这八字校训一直激励着我,无数个像芦老师一样的园丁用行动将它们教给我们这些学生。
感谢华为的陈栋,很幸运在我第一份工作中可以遇到一个对技术有信仰的前辈,他对技术不懈追求的态度让我在第一份工作中养成了良好的习惯。
感谢Intel的刘骏、徐杰、黄卫强、王龙和Foster,刘骏将我招入Intel,更开阔了我的视野,改变了我的人生轨迹。我曾经问他,他希望我在有余力的情况下学习些什么知识,他的回答是只要是学习,就会有帮助,无论什么。徐杰在我的工作中,对我信任有加,处处委以重任,让我在很短的时间内快速成长。
黄卫强和王龙是我在Intel的师傅(Buddy),在工作和生活中给了我很多建议,至今受用。Foster是BIOS和x86专家,帮助我快速地熟悉x86的原理。
感谢AMD的Winston、Gavin和Jennifer,让我在AMD学习到了很多芯片相关的知识,完成了本书的最后一环。Jennifer交给我具有挑战性的工作,让我在新的角色中快速成长。
姜亚华