找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 活动 查看内容

《Linux内核探秘》评论赠书活动

2014-01-23 22:41    评论: 36    

本书从工业需求角度出发,注重效率和实用性,是帮助内核研发及调试、驱动开发等领域工程师正确认识并高效利用Linux内核的难得佳作!

作者是腾讯公司资深的Linux内核专家和存储系统专家,在该领域工作和研究的10余年间,面试了数百位Linux内核工程师,深知学习Linux内核过程中经常遇到的困惑,以及在工作中容易犯的错误。基于这些原因作者撰写了本书。

本书出发点和写作方式可谓独辟蹊径,将Linux内核分为两个维度,一是基础部分和应用部分,二是内核架构和内核实现,将两个维有机统一,深入分析了Linux内核的文件系统、设备驱动的架构设计与实现原理。

全书在逻辑上分为三部分:

第一部分(第1~2章)首先将内核层划分为基础层和应用层,讲解了基础层包含的服务和数据结构,以及应用层包含的各种功能,然后对文件系统的架构进行了提纲挈领的介绍,为读者学习后面的知识打下基础。

第二部分(第3~9章)从设备到总线到驱动,逐步深入,剖析了设备的总体架构、为设备服务的特殊文件系统sysfs、字符设备和input设备、platform总线、serio总线、PCI总线、块设备的实现原理和工作机制。

第三部分(第10~13章)对文件系统的读写机制进行了深入分析,最后通过一个真实文件系统ext2,复习本书所有知识点。

作者:高剑林
机械工业出版社
2014年1月第1版第1次印刷
标准书号:ISBN 978-7-111-44585-2
定  价:59.00元

为什么要写这本书

目前市面上关于Linux内核方面的书籍可以分为两类,一类是学院派书籍,其中比较有名的包括《深入理解Linux内核》(ULK)等;一类是国内特有的培训教材。大体而言,学院派的书籍体系一般很完整,在广度和深度上都有完善的阐述。可惜也正因为它的完整、复杂和庞大,使得阅读学院派的书籍往往是个艰巨的任务。ULK这本书已经有八百页的体量,还有很多细节知识没有讲述,而早期的《内核情景分析》一书更是达到上千页的体量。以至于业界公认内核的学习曲线最陡峭,学习难度最大。

而本书是从工业界角度出发,为工业界使用而写。比较关注计算机科学方面进展的工程师,应可以意识到计算机科学和计算机工业是两个不同的领域。前者注重创新和理论完备,后者注重效率和实用。从效率和实用的角度,需要在降低学习难度的基础上提供相对体系化的结构,这就必须对庞大复杂的内核进行分解和抽取,这也正是本书试图将内核分解为基础层和应用层的原因。

这些年来,笔者先后面试过上百位内核工程师,组织过多次讲座或者交流会议,和国内多家公司的一流工程师有过深入交流。总体而言,国内内核应用和开发的水平处于非常低的水平,这一方面表现在理解内核的技术人员在国内总体上不多,即使是专业的内核的工程师,对内核的一些基本问题理解不清甚至理解错误的也不在少数;另一方面是大多数人认为内核在工作中用处不大,很难发挥价值。

针对第一个问题,笔者做过调查问卷,通过调查发现,公认学习内核最大的问题就是内核代码的难懂和跳跃。从一个函数跳到另一个函数,然后又跳到下一个函数,对执行的逻辑难以理解。跳跃超过三次,基本就难以继续,只能放弃。第二个问题和第一个问题强相关。因为了解不够系统,很难形成整体的内核执行逻辑。而实际工作中碰到的问题总是千变万化,个人了解的一块未必能碰到。比如一个文件系统只读问题,是内核VFS层的问题?是文件系统自身?还是块设备或者硬盘的问题?如果不能形成清晰的视图,就很难有针对性的调试和改进。

按照方法论的观点,通常人类的学习过程是从易到难、从部分到整体、从已知到未知。而对内核的学习有其特殊之处,内核几乎是九十度的学习曲线,极难找到入门的路径,更别说快速流畅地阅读内核代码了。从那时起,笔者开始对内核进行整理,希望能找到一条学习的路径,在不断探索过程中,逐渐形成一份文档,然后通过一些培训活动验证了其有效,最终形成了本书。

本书可以归纳为两个思路。一个是对内核代码的分类。笔者把内核分为基础部分和应用部分。内核中的内存管理、任务调度和中断异常处理归为基础部分。而文件系统、设备管理和驱动归为应用部分。打开一份完整的内核代码统计一下,应用部分占了绝大多数,庞大复杂,但冗余很多,很多代码具有相似性;而基础部分则是短小精悍。应用部分经常要调用基础部分提供的内存管理、任务调度等服务。为了快速理解基础部分,首先要整理基础部分的服务,理解在内核中如何使用基础部分的服务。

第二个思路是把内核分为内核架构和内核实现。内核架构是内核中通用的、具普遍性的层次,比如块设备、字符设备、总线、文件系统的VFS层等。理解了内核架构,就对内核有了整体上的掌握,就能了解内核设计者的思路,进而快速流畅地阅读内核代码。但即使理解了内核架构,也还有很多具体问题要攻克。比如驱动中一个寄存器的使用、设备链路状态如何检测、文件系统如何使用barrier I/O、同步和异步I/O的区别等。这是需要开发人员仔细研读和琢磨的。本书试图归纳整理出内核的常用架构层,这些架构层具有举一反三的作用,它们构成了Linux内核的骨架。

发展到今天,内核已经非常庞大和复杂。本书希望通过一些架构层次代码的分析,结合简单的例子,帮助读者理解内核的整体框架。当碰到内核问题或者需要加入某些内核功能或者修改某些实现时,可以迅速流畅地阅读相关代码,确定自己的方案,而不至于茫然无措。而对于细节的实现,则需要程序员根据自己的需求来设计。

关于内核版本,本书用的是2.6.18版。内核有一套自己的不兼容策略,不同内核版本之间经常不能编译,至于函数消失和数据结构修改更是家常便饭。所以我们只能选择一个版本作为基础。

阅读内核代码前的准备:下载一份完整的内核,Linux内核的官方网站是http://www.kernel.org,这里可以下载到各个版本的内核;再准备一个好的代码阅读软件,因为内核代码经常要前后关联阅读,所以需要具有代码工程管理的软件,强烈推荐source insight,这是国内应用很广的一个软件。

另外,本书已经假设读者能编译和安装模块,并且具有计算机基本结构的知识。此外,有一台已安装了Linux系统的计算机或者虚拟机,并且经常实战练习。

由于笔者水平有限,而且从架构层次分析内核代码,可用来参考的资料很少,希望广大读者能多提意见,共同推进中国的技术水平。

任何书籍都不能替代读者自己对内核实际代码的研究和学习。但如果没有书籍,浩如云烟的内核代码让有志学习者茫然,而低效率地一点点啃代码也会浪费大量的时间。书籍的作用是带领读者入门,读者需要尽快转入自我学习阶段,对需要的部分代码自行分析和研究。

读者对象

本书适合以下读者阅读参考:

  • 大专院校在校学生;
  • 对系统内核感兴趣,有志于从事内核研发的人员;
  • 从事驱动开发的工程师;
  • 从事操作系统内核方面工作的工程师;
  • 负责Linux系统调试和优化的技术人员。

如何阅读本书

本书将整个内核分为基础层和应用层。这种划分大大减少了阅读内核的难度,但是仍然需要对基础层有全面正确的理解。本书第1章介绍了内核的基础层,读者应该多做一些实践练习,才能加深理解。

第2章是本书提纲挈领的一章,重点介绍了文件系统的基础知识。文件系统在应用层的位置非常重要,因此只有掌握了文件系统的重要概念、理解了基本的操作过程才能为整体理解内核打下良好的基础。

第3~9章是关于设备的章节。建议读者结合具体的设备,从设备到总线再到驱动,逐步深入。本书的章节安排遵循从易到难、代码结合实例的方式,相信读者可以比较顺畅地阅读并理解。

第10~13章,再次对文件系统的读写和内核通用块层进行阐述。阅读的过程中,读者若能结合实际做一些小的程序,则可以帮助迅速提升能力。比如自己实现内核的I/O路径或者实现一个模拟的块设备系统,实践中应用才是能力提升的最佳途径。

勘误和支持

由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。书中的全部源文件可以从华章网站下载。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱easyblue99@hotmail.com,期待能够得到你们的真挚反馈。

致谢

感谢IBM公司的小强、中兴的老谢、百度的子旬、索尼的大A以及淘宝、Intel、微软、搜狐、新浪等公司的各位朋友。与你们的一次次讨论澄清了很多概念和问题,使我受益良多。

感谢机械工业出版社华章公司的编辑白宇,是你认真审核每一章的内容,提高了书稿的质量。编辑是个清苦的职业,远远谈不上令人羡慕,但不论多少生活的烦恼,白女士总是耐心修改,职业精神令人敬佩。

感谢我的亲人们,特别要感谢我的母亲,她是中国核工业的早期建设者,在艰难中养育了三个孩子,谨以此书献给我的母亲杨玉芳女士。感谢我的妻子和女儿,你们是我永远的动力之源。

目 录

  • 前 言
  • 第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
  • 1.6 本章小结 11
  • 第2章 文件系统 12
  • 2.1 文件系统的基本概念 12
  • 2.1.1 什么是VFS 13
  • 2.1.2 超级块super_block 13
  • 2.1.3 目录项dentry 14
  • 2.1.4 索引节点inode 15
  • 2.1.5 文件 17
  • 2.2 文件系统的架构 17
  • 2.2.1 超级块作用分析 17
  • 2.2.2 dentry作用分析 18
  • 2.2.3 inode作用分析 20
  • 2.2.4 文件作用分析 21
  • 2.3 从代码层次深入分析文件系统 21
  • 2.3.1 一个最简单的文件系统aufs 22
  • 2.3.2 文件系统如何管理目录和文件 26
  • 2.3.3 文件系统的挂载过程 38
  • 2.3.4 文件打开的代码分析 42
  • 2.4 本章小结 59
  • 第3章 设备的概念和总体架构 60
  • 3.1 设备的配置表 60
  • 3.2 访问设备寄存器和设备内存 61
  • 3.3 设备中断和DMA 61
  • 3.4 总线对设备的扫描 62
  • 3.5 设备驱动管理 62
  • 3.6 本章小结 62
  • 第4章 为设备服务的特殊文件系统sysfs 63
  • 4.1 文件和目录的创建 63
  • 4.1.1 sysfs文件系统的初始化 64
  • 4.1.2 sysfs文件系统目录的创建 64
  • 4.1.3 普通文件的创建 68
  • 4.2 sysfs文件的打开操作 69
  • 4.2.1 real_lookup函数详解 70
  • 4.2.2 为文件创建inode结构 70
  • 4.2.3 为dentry结构绑定属性 71
  • 4.2.4 调用文件系统中的open函数 72
  • 4.3 sysfs文件的读写 74
  • 4.3.1 读文件的过程分析 74
  • 4.3.2 写文件的过程分析 75
  • 4.4 kobject结构 76
  • 4.4.1 kobject和kset的关系 76
  • 4.4.2 kobject实例:总线的注册 77
  • 4.5 本章小结 79
  • 第5章 字符设备和input设备 80
  • 5.1 文件如何变成设备 80
  • 5.1.1 init_special_inode函数 80
  • 5.1.2 def_chr_fops结构 81
  • 5.2 input设备的注册 82
  • 5.2.1 主从设备号 83
  • 5.2.2 把input设备注册到系统 84
  • 5.2.3 设备区间的登记 85
  • 5.2.4 注册字符设备 86
  • 5.2.5 打开input设备 87
  • 5.3 input设备架构 88
  • 5.3.1 注册input设备的驱动 88
  • 5.3.2 匹配input管理的设备和驱动 89
  • 5.3.3 注册input设备 90
  • 5.4 本章小结 92
  • 第6章 platform总线 93
  • 6.1 从驱动发现设备的过程 93
  • 6.1.1 驱动的初始化 93
  • 6.1.2 注册驱动 94
  • 6.1.3 为总线增加一个驱动 95
  • 6.1.4 驱动加载 95
  • 6.1.5 遍历总线上已经挂载的设备 96
  • 6.2 从设备找到驱动的过程 98
  • 6.2.1 注册设备和总线类型 98
  • 6.2.2 注册设备的资源 99
  • 6.2.3 增加一个设备对象 100
  • 6.3 本章小结 102
  • 第7章 serio总线 103
  • 7.1 什么是总线适配器 103
  • 7.2 向serio总线注册设备 103
  • 7.2.1 注册端口登记事件 104
  • 7.2.2 遍历总线的驱动 106
  • 7.2.3 注册input设备 109
  • 7.3 虚拟键盘驱动 110
  • 7.3.1 键盘驱动的初始化 110
  • 7.3.2 与设备建立连接 111
  • 7.3.3 启动键盘设备 111
  • 7.3.4 输入设备和主机系统之间的事件 112
  • 7.4 键盘中断 112
  • 7.4.1 q40kbd设备的中断处理 113
  • 7.4.2 serio总线的中断处理 113
  • 7.4.3 驱动提供的中断处理 113
  • 7.5 本章小结 116
  • 第8章 PCI总线 117
  • 8.1 深入理解PCI总线 117
  • 8.1.1 PCI设备工作原理 117
  • 8.1.2 PCI总线域 118
  • 8.1.3 PCI资源管理 118
  • 8.1.4 PCI配置空间读取和设置 119
  • 8.2 PCI设备扫描过程 120
  • 8.2.1 扫描0号总线 120
  • 8.2.2 扫描总线上的PCI设备 121
  • 8.2.3 扫描多功能设备 124
  • 8.2.4 扫描单个设备 125
  • 8.2.5 扫描设备信息 125
  • 8.3 本章小结 128
  • 第9章 块设备 129
  • 9.1 块设备的架构 129
  • 9.1.1 块设备、磁盘对象和队列 129
  • 9.1.2 块设备和通用磁盘对象的绑定 130
  • 9.1.3 块设备的队列和队列处理函数 131
  • 9.2 块设备创建的过程分析 132
  • 9.2.1 nbd驱动的初始化 132
  • 9.2.2 为通用磁盘对象创建队列成员 133
  • 9.2.3 将通用磁盘对象加入系统 134
  • 9.3 块设备文件系统 135
  • 9.3.1 块设备文件系统的初始化 135
  • 9.3.2 块设备文件系统的设计思路 136
  • 9.4 块设备的打开流程 136
  • 9.4.1 获取块设备对象 137
  • 9.4.2 执行块设备的打开流程 140
  • 9.5 本章小结 142
  • 第10章 文件系统读写 143
  • 10.1 page cache机制 143
  • 10.1.1 buffer I/O和direct I/O 143
  • 10.1.2 buffer head和块缓存 143
  • 10.1.3 page cache的管理 144
  • 10.1.4 page cache的状态 145
  • 10.2 文件预读 146
  • 10.3 文件锁 146
  • 10.4 文件读过程代码分析 147
  • 10.5 读过程返回 161
  • 10.6 文件写过程代码分析 162
  • 10.7 本章小结 169
  • 第11章 通用块层和scsi层 170
  • 11.1 块设备队列 170
  • 11.1.1 scsi块设备队列处理函数 170
  • 11.1.2 电梯算法和对象 171
  • 11.2 硬盘HBA抽象层 172
  • 11.3 I/O的顺序控制 173
  • 11.4 I/O调度算法 173
  • 11.4.1 noop调度算法 173
  • 11.4.2 deadline调度算法 174
  • 11.5 I/O的处理过程 178
  • 11.5.1 I/O插入队列的过程分析 178
  • 11.5.2 I/O出队列的过程分析 186
  • 11.5.3 I/O返回路径 194
  • 11.6 本章小结 203
  • 第12章 内核回写机制 204
  • 12.1 内核的触发条件 204
  • 12.2 内核回写控制参数 204
  • 12.3 定时器触发回写 205
  • 12.3.1 启动定时器 205
  • 12.3.2 执行回写操作 207
  • 12.3.3 检查需要回写的页面 208
  • 12.3.4 回写超级块内的inode 209
  • 12.4 平衡写 213
  • 12.4.1 检查直接回写的条件 214
  • 12.4.2 回写系统脏页面的条件 215
  • 12.4.3 检查计算机模式 216
  • 12.5 本章小结 216
  • 第13章 一个真实文件系统ext2 217
  • 13.1 ext2的硬盘布局 217
  • 13.2 ext2文件系统目录树 218
  • 13.3 ext2文件内容管理 219
  • 13.4 ext2文件系统读写 219
  • 13.5 本章小结 219

样章地址: http://wenku.it168.com/d_001331586.shtml   

购买链接: http://www.amazon.cn/gp/product/B00H7TS8LA/ref=as_li_tf_tl?ie=UTF8&camp=536&creative=3200&creativeASIN=B00H7TS8LA&linkCode=as2&tag=wenku168-23 

 

活动内容

活动时间:2014年01月23日-01月29日

活动奖品:

活动结束后,我们会评选出5位积极参与评论的网友奖励《Linux内核探秘:深入解析文件系统和设备驱动的架构与设计》图书1本。

(临近春节,所以本次图书的递送将在春节假期后进行)

活动要求:

1、 在Linux中国(http://linux.cn)对本书进行评论,要言之有物,不能低于20个字。

2、 本次话题主要关注Linux内核及相关技术的讨论,以及对本书样章内容的评论。

最新评论

我也要发表评论

巴斯光年 2014-01-23 09:38 回复
又有新书,一楼收下了
kyohand 2014-01-23 09:39 回复
地板就让我坐了
星夜 2014-01-23 09:45 回复
目測此書很深奧,估計消化不了,繼續基礎學習的飄過。
ljsalm 2014-01-23 09:51 1 回复
看了《深入理解Linux内核》的全面几章,确实是内容太过庞大,让人觉得有点不知从那点入手好的,如果这本书真的基于工业界使用所写的话,估计应该会比较合适吧,毕竟有目的性的学习感觉比较容易吧!
love_daisy_love 2014-01-23 09:56 回复
想看和实践LSF,我觉得这对于目前的我就够用了。现在还不想去钻研kernel。大学的时候挺适合深钻下去的,可惜没有。
夜域诡士 2014-01-23 09:58 回复
我想我很需要这样的书来学习linux的内核,我对linux的内核有很深的兴趣,我相信了解它的人很多,我很期待成为其中一员,我很想成为一个这样的工程师,这是我的目标,我要位置去奋斗,去学习!!!
baoliguo 2014-01-23 10:01 回复
你好,我现在作为一个初入linux的工作者,对于驱动极为热爱,我自己也一直坚持使用linux系统。我坚持free,源码公开。但自己编写的代码相对其他人很低,需要坚持编写代码。希望得到这本书更上一层楼。
baoliguo 2014-01-23 10:07 回复
对于样章,看了一下,感觉还可以,对于我来说,还可以学习的。很有价值。
夜域诡士 2014-01-23 10:20 回复
我想我很需要这样的书来学习linux的内核,我对linux的内核有很深的兴趣,我相信了解它的人很多,我很期待成为其中一员,我很想成为一个这样的工程师,这是我的目标,我要位置去奋斗,去学习!!!
克己 2014-01-23 11:09 回复
读了样章,感觉内容详实,不是生搬硬套抄袭外国著作,内容是建立在实际工作经验之上,不是泛泛而谈,图表较多,读者更易理解。
shadowlong 2014-01-23 11:10 回复
在读大学生,软件工程专业,早就对Linux内核机制感兴趣,以前通读了Unix/Linux大学教程这本书,但没有对内核有详细了解,《Linux内核探秘》应该对我有所帮助。
IT经理 2014-01-23 14:57 回复
阅读样章,产生了一探Linux内核秘密的念头,很想深入了解Linux内核的运行机制,我使用Linux已经有七八年了,长期使用的Linux发行版有Redhat、CentOS、Ubuntu、SuSE、Fedora等,但是内核这块一直没有接触过,但愿能获得这本书,好好读一下。
Machine 2014-01-23 16:46 回复
上次非常荣幸地拿到了系统编程那套书  非常开心也非常感谢      这次不贪心   希望能拿到书的小伙伴们能带着对linux的内核有很深的兴趣深入了解Linux内核的运行机制    向大家推荐这本书   也许这只是一个部分     多多关注本社区  Linux中国的微信号:Linux-cn    微博
绿色圣光 2014-01-23 20:41 回复
居然推荐 source insight ?!
7th 2014-01-24 08:55 回复
各种福利啊!给力!凑凑热闹!
nikanke 2014-01-24 09:40 回复
一直在使用linux,但是对linux内核等原理性的东西,掌握的还太少,正好看到这个活动。。。。希望得到哦
飘逸水果鸟 2014-01-24 10:21 回复
《深入理解Linux内核》英文版读起来有难度,中文版翻译的不贴切,理解容易有偏差。试读样章,本书是接地气,本土化的实用书,希望能成为linux方面的必备书,也希望能有linux网络和linux 驱动的接地气的本土大作。
隺伯特 2014-01-24 10:23 回复
这次我就不申请了,不太需要,让给别人吧,还是那本Linux/UNIX系统编程手册比较适合我
skydada 2014-01-24 11:04 回复
对于阐述内核的书籍,大体来说一般是将内存管理、文件系统、进程调度、进程间通信、网络接口这五个子系统中的前四者分开讲述。在每个子系统中也一般只是讲述一个重要的函数,而且已粘贴上源代码和分析代码功能为主,虽然整体能连成一个体系,但作者的这种意图没有充分地表达给读者。
这种书籍导致的结果是读者没能更好地实现整体理解和运用,知识不能够实现体系,只能说有一个粗略的大致框架,而且容易遗忘具体小细节,容易在工作中犯错误。
从样章上来看,《Linux内核探秘》整体写作思路是首先让读者了解每一部分的架构,再从部分代码出发,最后细微到细小的开发问题,使整本书的可读性大大增强;在驱动设备方面,涉及内容相对其他同类书要广而实用,包括platform总线、serio总线、PCI总线;与传统的Linux内核书籍相比,貌似本书cache部分没有讲slab,个人感觉这个还是比较重要的。
另外一方面,因为Linux内核可以运用在各个平台上,在书籍中可以考虑增加在不同平台上的代码区别,如x86、arm和PPC等。从而了解基于不同平台下的底层差别。
看过《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》,华章出版的国人著的书质量感觉都挺不错的,推荐这本《Linux内核探秘》。

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。