前言
Linux内核是使用最广泛的开源内核,在服务器和智能手机领域处于统治地位,物联网、大数据、云计算和人工智能等热点技术也离不开Linux内核。对于商业公司而言,采用开源的Linux内核可以享受很多好处,比如节约成本,可以利用行业先进的技术,还可以根据自己的需求定制、修改内核。对于个人而言,从Linux内核中可以学习先进的设计方法和编程技术,为内核贡献代码可以证明自己的技术实力。
可是,当我们准备学习Linux内核时,会发现Linux内核的代码庞大而复杂,在没有专业书籍指导的情况下,读懂代码是一件非常困难的事情。作者编写本书的目的是为想要深入理解Linux内核的软件工程师提供指导。
本书介绍4.12版本的Linux内核,建议读者在阅读本书时到Linux内核的官方网站中下载一份代码,对照代码学习。推荐使用“Source Insight”软件阅读代码。
Linux内核支持多种处理器架构,处理器架构特定的代码放在“arch”目录下。ARM处理器在手机和平板电脑等移动设备上处于统治地位。ARM处理器从ARMv7演进到支持64位的ARMv8, ARM公司重新设计了处理器架构,ARMv8定义了AArch64和AArch32两种执行状态,AArch64是64位架构;AArch32是32位架构,兼容ARMv7。因为ARMv8和ARMv7的差别很大,所以Linux内核把ARMv8和ARMv7当作两种不同的处理器架构,ARMv7架构的代码放在“arch/arm”目录下,ARMv8架构的代码放在“arch/arm64”目录下。人们通常把ARMv8架构的AArch64执行状态称为ARM64架构。本书在介绍Linux内核时选择ARM64处理器架构。
学习本书,需要具备ARM64处理器的基础知识,推荐以下两篇文档,读者可以从ARM公司的网站下载。
(1)“ARM Cortex-A Series Programmer's Guide for ARMv8-A”:这篇文档接近300页,适合入门学习。
(2)“ARM Architecture Reference Manual ARMv8, for ARMv8-A architecture profile”:这篇文档有6000多页,写得很详细,适合当作工具书来查询。
学习内核,关键是要理解数据结构之间的关系和函数调用关系。内核中数据结构之间的关系错综复杂,函数调用层次深,有些函数中的分支非常多,一个函数就可能涉及很多技术,这些都是初学者学习中的障碍。作者建议读者在学习时抓住主要线索,弄清楚执行流程,刚开始不要过多关注函数的细节。为了方便学习,作者绘制了很多图来描述数据结构之间的关系和函数的执行流程。另外,作者在介绍每种技术时会先介绍使用方法,从使用方法开始学习技术,相信会对读者理解技术有很大的帮助。
全书内容共分为6章。
第1章介绍内核的引导过程,本书选择常用的引导程序U-Boot,读者可以从德国DENX软件工程中心的网站下载U-Boot的代码,对照学习。
第2章介绍内核管理和调度进程的技术原理。
第3章介绍内核管理虚拟内存和物理内存的技术原理。
第4章介绍内核处理异常和中断的技术原理,以及系统调用的实现方式。
第5章介绍内核实现的各种保护临界区的互斥技术。
第6章介绍内核的虚拟文件系统,内核使用虚拟文件系统支持各种不同的文件系统。
本书适用于维护或者开发Linux内核的软件工程师、基于Linux内核开发设备驱动程序的软件工程师,以及想要学习了解Linux内核的软件工程师和学生。
对于从事应用程序开发的软件工程师,是否有必要学习内核呢?应用程序通常使用封装好的库,看起来似乎和内核没有关系,但是库是在内核提供的系统调用的基础上做了一层封装。读者如果研究了库函数和内核配合实现库函数提供的功能,那么对软件运行过程的理解将会更深刻,个人的技术水平也将会提升到新的高度—能够设计开发出高质量的应用程序,在软件运行过程中出现问题时可以快速地分析定位。另外,内核代表了软件行业的最高编程技术,这些编程技术也适用于应用程序。
最后,感谢我的家人和朋友在本书编写过程中提供的大力支持,感谢提供宝贵意见的同事们,感谢提供技术支持的朋友们,感恩我遇到的众多良师益友。
余华兵
2019年春