前言
本书是一本基于龙芯平台,结合源代码来探索和解析Linux内核的书。
为什么写作本书
市面上解析Linux内核的经典书籍已有不少,国内原创的有《Linux内核完全注释》《Linux内核源代码情景分析》《边学边干Linux内核指导》;从国外引进的有《Linux内核设计与实现》(Linux Kernel Development,简称LKD)、《Linux设备驱动程序》(Linux Device Drivers,简称LDD)、《深入理解Linux内核》(Understanding the Linux Kernel,简称ULK)和《深入Linux内核架构》(Professional Linux Kernel Architecture)。其中LKD、LDD、ULK和《Linux内核源代码情景分析》这4本经典书籍曾经被称为Linux内核领域的“四库全书”。那么,为什么还要写作本书呢?
一方面,大多数已有书籍是基于X86或者ARM体系结构的,而本书基于MIPS家族的龙芯处理器平台;另一方面,大多数已有书籍基于2.4版本或者2.6版本的Linux内核,而本书基于新的5.x版本的Linux内核。
其实,新书也是有的,尤其难能可贵的是还有原创新书。比如,2017年问世了一本由张天飞(网名“笨叔叔”)编写的《奔跑吧 Linux内核》。目前这本书得到了读者的广泛好评,可以说是第一本(小声地说一句,其实本书开始撰写的时间比它更早)基于4.x版本的内核书籍。2019年又出版了一本由余华兵(我的校友)编写的《Linux内核深度解析》,它也是基于4.x版本的内核。不过,这两本书专注于ARM/ARM64架构,主要篇幅在内存管理、进程管理和中断管理上面,不涉及设备驱动(但《Linux内核深度解析》涉及文件系统);而本书专注于MIPS/龙芯架构,基于目前最新的5.x版本的内核(以5.4版本为主),而且对内核的覆盖也更为全面,除异常/中断处理、内存管理和进程管理之外还涉及设备驱动和电源管理。因此《奔跑吧 Linux内核》《Linux内核深度解析》和本书相比各有千秋。
本书的读者对象
如果你想对Linux内核的总体轮廓有个初步了解,请阅读《Linux内核设计与实现》。
如果你想接触内核源代码,又不想迷失在浩瀚的代码海洋中,请阅读《Linux内核完全注释》,这本书基于早期的0.11版本的Linux内核,虽然代码非常精简,但足以阐述各种操作系统原理。
如果你已经不再满足于“史前时代”的内核版本,想在相对现代的Linux内核上练练手脚,请阅读《边学边干Linux内核指导》。
如果你已经开始真正的内核开发,并且偏重于设备驱动的话,请阅读《Linux设备驱动程序》。
如果以上书籍已经不能满足你,那么恭喜,你已经突破了第一重境界。从现在开始,可以阅读《深入理解Linux内核》了。这本书虽然比较艰深,但却是经典中的经典。在读此书之前,你看山是山,看水是水;在阅读此书的过程中,你将看山不是山,看水不是水;最后,当你历尽千辛万苦将此书学透之后,你将看山还是山,看水还是水。
等等,怎么没有提“四库全书”中的《Linux内核源代码情景分析》一书?个人愚见,这是一本非常详细的工具书。你可以把它当字典用,但如果当成教程直接阅读,很容易迷失自我,“不识庐山真面目,只缘身在此山中”。
如果你需要4.x、5.x等新版本内核的源码解析,那么《奔跑吧 Linux内核》《Linux内核深度解析》和本书都适合你。《奔跑吧 Linux内核》主要基于4.0.0版本的Linux内核;《Linux内核深度解析》主要基于4.12.0版本的Linux内核;而本书绝大多数代码基于5.4.0版本的Linux内核。如果你基于龙芯处理器做内核开发,或者有兴趣将来从事这方面的工作,那么恭喜,本书非常适合你。
一直以来,从事龙芯内核开发工作的“标准教程”是《龙芯处理器用户手册》《MIPS体系结构透视(第2版)》和《深入理解Linux内核(第3版)》。然而,《龙芯处理器用户手册》不涉及Linux内核;《MIPS体系结构透视(第2版)》讲述的是传统的MIPS处理器,离真正的龙芯差距太大;而《深入理解Linux内核(第3版)》所使用的内核版本又过于陈旧。本书试图解决这些问题。
本书使用的Linux内核源代码的Git仓库建立在江苏航天龙梦信息技术有限公司(以下简称航天龙梦)的开发者网站上,读者可自行下载:http://dev.lemote.com:8000/cgit/linux-official.git/。
本书的内容概述
本书基于龙芯处理器和Linux内核。第1章概括性地介绍了龙芯处理器和Linux内核,同时还引入了一种快速而有效的代码阅读方法和一种开发健壮内核的方法。在此基础上,第2章将开始解析Linux内核在龙芯计算机上的启动过程。第3~5章分别介绍操作系统的3大核心功能:异常与中断处理、内存管理和进程管理。Linux是包含设备驱动的一体化内核(或称宏内核,与之相对的是微内核),第6章和第7章将以显卡驱动与网卡驱动为例来进行原理说明。电源管理是操作系统中一个相对独立但又必不可少的功能组件,第8章将专门予以介绍。
如何学习本书
本书采用了循序渐进的写作方法,非常适合按顺序进行阅读。本书的大部分内容用于解析Linux内核源代码,因此读者需要一边看书一边对照阅读代码。
第1章的“基础知识”首先会对龙芯处理器和Linux内核进行概括性的介绍。虽然本书是一本解读源代码的书,但跟别的书籍不一样:我们较多地瞄准代码的主干流程,而较少地涉及细枝末节。因此,在第1章中,我们会给读者介绍一种快速而有效的代码阅读方法,称为“先观其大略,再咬文嚼字”,并且引入了“树形视图”和“链式视图”两种比流程图更有用的代码解析方法。从某种意义上说,学习内核是为了开发内核,因此这一章还会教读者如何开发和维护健壮的内核代码。
操作系统本质上是一个大程序,顺着程序的执行流程一起前进是自然而然的事情。因此,我们认为从启动过程开始研究Linux内核是一个比较好的切入点。在掌握基础知识以后,读者可以通过第2章学习和了解Linux内核在龙芯计算机上从上电开始的整个启动过程,并以此获得一个对龙芯处理器和Linux内核的宏观印象。
异常与中断处理、内存管理和进程管理是操作系统的3大核心功能,我们就在后续的3章中分别予以介绍。这3章遵循“从基础到上层”和“广度优先深度其次”的写作原则,读者既可根据编写顺序来阅读学习,也可根据个人兴趣自行安排阅读顺序。
由于Linux是一体化内核操作系统,因此设备驱动也放在内核层实现。设备驱动所涵盖的范围非常广泛,本书不可能面面俱到,因此只选取了两种常用的典型设备驱动——Radeon显卡与E1000E网卡,来做举例性的原理说明。读者可根据自身需要进行选择性学习。
电源管理在操作系统内核中相对独立,因此与前面的章节没有太大的关联,读者掌握基础知识以后即可根据需要选择性阅读。
对自旋锁、信号量等各种并发与同步原语或者内核发展历史感兴趣的读者,可直接通过附录进行学习。
陈华才
2020年5月
[1] 最经典的《深入理解Linux内核》一共出了3版,其中第3版讲述的是2.6.11版本的Linux内核;2010年出版的《深入Linux内核架构》讲述的是2.6.24版本的Linux内核,这两本书都是基于X86平台。