【好文推荐】
前言
很多人觉得Linux内核很难,确实Linux内核代码的庞大也令不少人“望而却步”,但是究其原因可以总结为以下两点:
1、认为内核源码“高不可攀”。其实内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。
2、需要丰富的理论基础。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。
一.如何正确的阅读源码呢?
首先我们来说一下操作系统。百度百科说它是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统。在Linux中则被称为“内核”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。所以,如果需要阅读内核首先要做到三件事:
1、需要对C语言十分精通。也就是说需要做到对C语言的编译过程了然于心。如果达不到要求,推荐读一下《C程序设计语言(第2版·新版)典藏版》——C语言的设计者之一Dennis M.Ritchie 和著名的计算机科学家 Brian W.Kernighan合著的介绍C语言的权威经典著作,我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。人们熟知的“Hello,World”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。
2、对汇编语言有一定了解,至少熟悉AT&T的基本汇编语法,了解伪指令和指令的差异。这里推荐《编译原理(原书第2版)》。本书是编译领域无可替代的经典著作,被广大计算机专业人士誉为“龙书”的最新版本。自本书出版以来,被世界各地的著名高等院校和研究机构(包括美国哥伦比亚大学、斯坦福大学、哈佛大学、普林斯顿大学、贝尔实验室)作为本科生和研究生的编译原理课程的教材。该书对我国计算机教育领域也具有重大影响。
3、对操作系统本身有一定了解,理解四个基本概念:Process/Thread(线程/进程)、VMS(虚拟内存系统)、VFS(虚拟文件系统)、I/O。这里我们可以读一下《操作系统概念(原书第9版)》。本书是操作系统领域的经典著作,从第1版至今全程记录了操作系统的发展历史,被国内外众多高校选作教材。全书共六部分,不仅详细讲解了进程管理、内存管理、存储管理、保护与安全等概念,而且涵盖重要的理论结果和案例研究,并且给出了供读者深入学习的推荐读物。这一版新增了多核系统和移动计算的内容,每一章都融入了新的技术进展,并且更新了习题和编程项目。
二.准备步骤
有了准备工作之后,我们来看一下阅读Linux内核代码有哪些准备步骤:
1、选择处理器。这里选择ARM或者x86(选择一种即可),关于二者的区别这里不做介绍。需要了解六大CPU机制:寄存器机制、多级缓存机制、分段机制、分页机制、中断机制、多核同步机制。
2、选择一个版本的内核源码,截止目前最新版本为v5.11.7。
3、下载选定版本的内核源码,并按照所选的CPU架构裁剪源码(删掉其他架构的源码)。
4、配置好编译流程。
三.建议
好了,到这里已经可以阅读内核了,不过还是给出几点建议,希望对你有用:
1、用 SourceInsight辅助普通IDE阅读内核源码,方便阅读。
2、早期,我们可以在内核源码的任意地方,打印输出调试信息,辅助学习;熟了之后,自己写一个内核模块,可以通过/proc/kallsyms找到任意内核符号的地址,从而可以随时读取任意的内核数据,辅助学习。
在已定位好的源码文件中,分析每个变量、宏、函数、结构体等代码元素的大致含义和功能,增加简单注释。接着只有沉下心来,弄清每个关键的难点,才能保证以后碰到类似的难点不会再被困住。