基本信息

【插图】

编辑推荐
腾讯资深Linux内核专家10余年工作经验结晶,业界多位专家联袂推荐,Linux内核工程师和驱动开发工程师的必读之作
从工业需求角度另辟蹊径,注重效率和实用性,将Linux内核分为基础部分和应用部分以及内核架构和内核实现两个维度,对Linux内核的文件系统、设备驱动的架构设计与实现原理进行了深入分析
内容简介
计算机书籍
《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》从工业需求角度出发,注重效率和实用性,是帮助内核研发及调试、驱动开发等领域工程师正确认识并高效利用Linux内核的难得佳作!作者是腾讯公司资深的Linux内核专家和存储系统专家,在该领域工作和研究的10余年间,面试了数百位Linux内核工程师,深知学习Linux内核过程中经常遇到的困惑,以及在工作中容易犯的错误。基于这些原因作者撰写了《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》。《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》出发点和写作方式可谓独辟蹊径,将Linux内核分为两个维度,一是基础部分和应用部分,二是内核架构和内核实现,将两个维有机统一,深入分析了Linux内核的文件系统、设备驱动的架构设计与实现原理。
全书在逻辑上分为三部分:第一部分(第1~2章)首先将内核层划分为基础层和应用层,讲解了基础层包含的服务和数据结构,以及应用层包含的各种功能,然后对文件系统的架构进行了提纲挈领的介绍,为读者学习后面的知识打下基础;第二部分(第3~9章)从设备到总线到驱动,逐步深入,剖析了设备的总体架构、为设备服务的特殊文件系统sysfs、字符设备和input设备、platform总线、serio总线、PCI总线、块设备的实现原理和工作机制;第三部分(第10~13章)对文件系统的读写机制进行了深入分析,最后通过一个真实文件系统ext2,复习本书所有知识点。
作译者
目录
前 言
第1章 内核的基础层和应用层 1
1.1 内核基础层提供的服务 1
1.1.1 内核中使用内存 2
1.1.2 内核中的任务调度 2
1.1.3 软中断和tasklet 3
1.1.4 工作队列 4
1.1.5 自旋锁 5
1.1.6 内核信号量 5
1.1.7 原子变量 5
1.2 内核基础层的数据结构 6
1.2.1 双向链表 6
1.2.2 hash链表 6
1.2.3 单向链表 7
1.2.4 红黑树 7
1.2.5 radix树 7
1.3 内核应用层 8
1.4 从Linux内核源码结构纵览内核 9
1.5 内核学习和应用的四个阶段 10
前言
目前市面上关于Linux内核方面的书籍可以分为两类,一类是学院派书籍,其中比较有名的包括《深入理解Linux内核》(ULK)等;一类是国内特有的培训教材。大体而言,学院派的书籍体系一般很完整,在广度和深度上都有完善的阐述。可惜也正因为它的完整、复杂和庞大,使得阅读学院派的书籍往往是个艰巨的任务。ULK这本书已经有八百页的体量,还有很多细节知识没有讲述,而早期的《内核情景分析》一书更是达到上千页的体量。以至于业界公认内核的学习曲线最陡峭,学习难度最大。
而本书是从工业界角度出发,为工业界使用而写。比较关注计算机科学方面进展的工程师,应可以意识到计算机科学和计算机工业是两个不同的领域。前者注重创新和理论完备,后者注重效率和实用。从效率和实用的角度,需要在降低学习难度的基础上提供相对体系化的结构,这就必须对庞大复杂的内核进行分解和抽取,这也正是本书试图将内核分解为基础层和应用层的原因。
这些年来,笔者先后面试过上百位内核工程师,组织过多次讲座或者交流会议,和国内多家公司的一流工程师有过深入交流。总体而言,国内内核应用和开发的水平处于非常低的水平,这一方面表现在理解内核的技术人员在国内总体上不多,即使是专业的内核的工程师,对内核的一些基本问题理解不清甚至理解错误的也不在少数;另一方面是大多数人认为内核在工作中用处不大,很难发挥价值。
针对第一个问题,笔者做过调查问卷,通过调查发现,公认学习内核最大的问题就是内核代码的难懂和跳跃。从一个函数跳到另一个函数,然后又跳到下一个函数,对执行的逻辑难以理解。跳跃超过三次,基本就难以继续,只能放弃。第二个问题和第一个问题强相关。因为了解不够系统,很难形成整体的内核执行逻辑。而实际工作中碰到的问题总是千变万化,个人了解的一块未必能碰到。比如一个文件系统只读问题,是内核VFS层的问题?是文件系统自身?还是块设备或者硬盘的问题?如果不能形成清晰的视图,就很难有针对性的调试和改进。
按照方法论的观点,通常人类的学习过程是从易到难、从部分到整体、从已知到未知。而对内核的学习有其特殊之处,内核几乎是九十度的学习曲线,极难找到入门的路径,更别说快速流畅地阅读内核代码了。从那时起,笔者开始对内核进行整理,希望能找到一条学习的路径,在不断探索过程中,逐渐形成一份文档,然后通过一些培训活动验证了其有效,最终形成了本书。
本书可以归纳为两个思路。一个是对内核代码的分类。笔者把内核分为基础部分和应用部分。内核中的内存管理、任务调度和中断异常处理归为基础部分。而文件系统、设备管理和驱动归为应用部分。打开一份完整的内核代码统计一下,应用部分占了绝大多数,庞大复杂,但冗余很多,很多代码具有相似性;而基础部分则是短小精悍。应用部分经常要调用基础部分提供的内存管理、任务调度等服务。为了快速理解基础部分,首先要整理基础部分的服务,理解在内核中如何使用基础部分的服务。
第二个思路是把内核分为内核架构和内核实现。内核架构是内核中通用的、具普遍性的层次,比如块设备、字符设备、总线、文件系统的VFS层等。理解了内核架构,就对内核有了整体上的掌握,就能了解内核设计者的思路,进而快速流畅地阅读内核代码。但即使理解了内核架构,也还有很多具体问题要攻克。比如驱动中一个寄存器的使用、设备链路状态如何检测、文件系统如何使用barrier I/O、同步和异步I/O的区别等。这是需要开发人员仔细研读和琢磨的。本书试图归纳整理出内核的常用架构层,这些架构层具有举一反三的作用,它们构成了Linux内核的骨架。
发展到今天,内核已经非常庞大和复杂。本书希望通过一些架构层次代码的分析,结合简单的例子,帮助读者理解内核的整体框架。当碰到内核问题或者需要加入某些内核功能或者修改某些实现时,可以迅速流畅地阅读相关代码,确定自己的方案,而不至于茫然无措。而对于细节的实现,则需要程序员根据自己的需求来设计。
关于内核版本,本书用的是2.6.18版。内核有一套自己的不兼容策略,不同内核版本之间经常不能编译,至于函数消失和数据结构修改更是家常便饭。所以我们只能选择一个版本作为基础。
阅读内核代码前的准备:下载一份完整的内核,Linux内核的官方网站是http://www.kernel.org,这里可以下载到各个版本的内核;再准备一个好的代码阅读软件,因为内核代码经常要前后关联阅读,所以需要具有代码工程管理的软件,强烈推荐source insight,这是国内应用很广的一个软件。
另外,本书已经假设读者能编译和安装模块,并且具有计算机基本结构的知识。此外,有一台已安装了Linux系统的计算机或者虚拟机,并且经常实战练习。
由于笔者水平有限,而且从架构层次分析内核代码,可用来参考的资料很少,希望广大读者能多提意见,共同推进中国的技术水平。
任何书籍都不能替代读者自己对内核实际代码的研究和学习。但如果没有书籍,浩如云烟的内核代码让有志学习者茫然,而低效率地一点点啃代码也会浪费大量的时间。书籍的作用是带领读者入门,读者需要尽快转入自我学习阶段,对需要的部分代码自行分析和研究。
读者对象
本书适合以下读者阅读参考:
大专院校在校学生;
对系统内核感兴趣,有志于从事内核研发的人员;
从事驱动开发的工程师;
从事操作系统内核方面工作的工程师;
媒体评论
——王营百度高级研发工程师
★本书由国内著名互联网企业的一线架构师撰写。作者在工作中能够快速地制定出系统方案,与作者对操作系统内核的深入理解密不可分。本书基础层和应用层的划分颇具新意,能很好地帮助读者理清Linux内核的脉络,希望有更多人学习和研究系统内核,提升国内企业的核心能力。
——谢宝友中兴通讯操作系统平台部技术总工程师
★作为长期从事内核和分布式文件系统开发的技术人员,我很高兴看到我的朋友高剑林出版这本书。从本书的结构和内容来看,这是一本授之以渔的书。虽然Linux内核代码庞杂,但这本书却能为读者迅速理出一条清晰的主线,让读者感受到Linux内核的魅力并继续深入进去。非常值得一读,推荐!
——许家强IBM高级工程师
★Linux的内核也是Android的内核,理解Linux内核是Android系统级研发人员的必备技能之一。相对于传统的Linux经典专著,剑林这本书更多地从实践和应用的视角分析了内核的架构和设计,既可以为读者展示内核的清晰脉络,又不至于让读者迷失在Linux的汪洋大海中。
——杨云君?SONY资深Android系统专家/畅销书《Android的设计与实现:卷I》作者
★和剑林是多年同事,他一直专注于内核子系统各个层次的研究,现在转而从事分布式文件系统的研究。本书读起来比其他内核的书籍更加亲切,充分体现了剑林深厚的工程开发能力,绝对是操作系统入门必不可少的优选书。书中内容通俗易懂,入门门槛低。
——孙子荀腾讯高级工程师
书摘
内核的基础层和应用层
前言中提到,内核分为内核基础层和内核应用层。这既有对整个操作系统软件架构的分析和理解,也有现实应用情况的支持。
操作系统对应用软件提供了统一的编程接口,操作系统的系统调用是稳定的、向下兼容的,但是在内核中,并不提供这种稳定且兼容的保证。实际上,同样的代码在不同的内核版本经常可能编译失败。内核的这种开发模式,造成了学习内核时版本众多而且不稳定的特点,也大大增加了学习的困难。
在长期对内核代码的分析和应用中,笔者注意到一个事实:内核中提供了大量的软件基础设施。这些基础设施既包括内核中对内存的使用,对进程调度的控制,也包括自旋锁、信号量等内核提供的同步函数,同时还包括内核提供的数据结构,比如链表、hash链表、红黑树等。这些软件基础设施如同操作系统提供的系统调用一样,是理解内核代码和编写内核代码的基础。而这些软件基础设施在各个内核版本中基本是稳定的。
现实情况提供了另一方面的支持。学习的动力来自于应用,传统的操作系统教科书全面,但也很少有人能完全读懂并且结合代码进行实战应用。大多数程序员在工作中应用到内核的部分,绝大多数是设备驱动,而讲操作系统的书多数不会关注到设备驱动层面。除了设备驱动之外,内核中文件系统也有较多的应用。
要做到快速流畅地阅读内核代码,前提是了解内核中的软件基础设施。这些知识使用范围很广,分布在内核代码的各个部分,如果不了解,在内核代码的理解上就容易出现障碍。
……