新書推薦:
《
利他主义的生意:偏爱“非理性”的市场(英国《金融时报》推荐读物!)
》
售價:NT$
352.0
《
认知行为疗法:心理咨询的顶层设计
》
售價:NT$
454.0
《
FANUC工业机器人装调与维修
》
售價:NT$
454.0
《
吕著中国通史
》
售價:NT$
286.0
《
爱琴海的光芒 : 千年古希腊文明
》
售價:NT$
908.0
《
不被他人左右:基于阿德勒心理学的无压力工作法
》
售價:NT$
301.0
《
SDGSAT-1卫星热红外影像图集
》
售價:NT$
2030.0
《
股市趋势技术分析(原书第11版)
》
售價:NT$
1010.0
編輯推薦:
(1)内容全面,全书分成两篇,*篇是Linux基本框架,第二篇是Linux文件系统及相关内容。(2)表述清晰明了,以内存模型和时空模型为主要参考来分析各章的相关内容,给出了比较直观的图示。(3)对希望了解Linux内核和相关开发人员也非常有参考价值。
內容簡介:
本书内容分成两篇,第一篇是基本框架,第二篇是文件系统及相关内容。在第一篇的各章中:第1章先对Linux进行简要介绍并给出本书分析时所用的模型;第2章从C语言程序、可执行文件到进程的虚存空间影像的全过程作为起点,给读者建立起进程用户空间管理的概念;然后第3章讨论物理页帧如何支撑这些虚存空间,并且讨论了与物理空间一致的内核空间的管理;接着第4章就是进程的概念、进程的组织、进程切换和进程的创建撤销等活动;第5章专门讨论进程调度和负载均衡问题;后面4章继续讨论进程间通信、系统调用、内核的并发活动和同步问题。第二篇开始讨论盘根错节的文件系统:先在第10章分析文件系统和VFS的基本概念;然后在第11章讨论页高速缓存及块缓存;第12章分析了VFS的通用文件访问操作;第13章讨论ext2文件系统的具体格式和操作细节;接着第14章讨论同步;第15章讨论内存回收问题;最后第16章和第17章讨论设备管理和块设备问题。 本书以内存模型和时空模型为主要参考来分析各章的相关内容,给出了比较直观的图示,这不仅对初学者非常有用,对希望了解Linux内核的读者和相关开发人员也非常有参考价值。
目錄 :
目 录
第一篇 基 本 框 架
第1章 Linux内核概述 3
1.1 UNIX与Linux 3
1.1.1 UNIX 3
1.1.2 Linux 3
1.1.3 宏内核与微内核 6
1.1.4 Linux内核源码及版本 6
1.2 Linux内核模型 11
1.2.1 多视角下的内核 11
1.2.2 功能模型 14
1.2.3 内存模型 15
1.2.4 时空模型 16
1.2.5 特权模型 17
1.3 本书局限性 18
小结 18
第2章 进程影像 20
2.1 从源代码到进程 20
2.1.1 源代码、目标文件 20
2.1.2 可执行文件与进程影像 26
2.2 proc中的进程 32
2.2.1 进程内存空间 32
2.2.2 进程运行状态等信息 33
2.3 进程空间 35
2.3.1 进程空间描述符 36
2.3.2 虚存区域VMA 40
2.3.3 VMA属性 45
2.4 ELF可执行文件装入过程 48
2.4.1 ELF装入函数 49
2.4.2 ELF格式 49
2.5 进程空间的动态变化 54
2.5.1 VMA上的操作 54
2.5.2 文件映射 55
2.5.3 堆的调整 58
2.5.4 栈的变化 60
2.6 并发的进程空间 60
小结 61
第3章 虚拟空间的物理支撑 63
3.1 物理内存组织与管理 64
3.1.1 节点与内存域 64
3.1.2 物理页帧 79
3.1.3 buddy系统 84
3.1.4 页帧迁移 94
3.1.5 内存热插拔 98
3.2 地址映射与页表 99
3.2.1 分页机制与页表 99
3.2.2 缺页异常 103
3.3 内核空间 104
3.3.1 一致映射与高端内存 104
3.3.2 一致内存分配 108
3.3.3 非一致内存分配 109
3.3.4 slub分配器 115
小结 130
第4章 进程组织与基础行为 131
4.1 进程组织管理 131
4.1.1 PCB进程控制块 131
4.1.2 命名空间 135
4.1.3 进程标识 141
4.1.4 进程间关系 148
4.1.5 进程资源限制 151
4.2 进程创建与撤销 152
4.2.1 进程创建 152
4.2.2 execve系统调用 159
4.2.3 内核线程 160
4.2.4 Linux进程树 162
4.2.5 进程的撤销 167
4.3 进程切换 167
4.3.1 切换时机 168
4.3.2 切换过程 169
4.3.3 切换示例 178
小结 181
第5章 进程调度与负载均衡 193
5.1 调度与均衡基本框架 193
5.2 进程状态与转换 194
5.2.1 进程调度状态 194
5.2.2 进程状态变迁 196
5.3 进程调度 198
5.3.1 调度框架 198
5.3.2 完全公平调度 215
5.3.3 实时调度 230
5.3.4 STOP和IDLE调度类 234
5.3.5 调度控制与proc接口 236
5.4 负载均衡 241
5.4.1 处理器层次结构 242
5.4.2 调度的层次管理 243
5.4.3 CFS任务的负载均衡 250
5.4.4 实时负载均衡 254
小结 258
第6章 进程间通信与同步 259
6.1 管道通信 260
6.1.1 无名管道 260
6.1.2 命名管道 261
6.1.3 管道数据结构 261
6.1.4 管道操作 266
6.2 System V IPC 269
6.2.1 IPC标识与命名空间 269
6.2.2 IPC公共框架 275
6.2.3 IPC信号量 279
6.2.4 IPC消息队列 283
6.2.5 IPC共享内存 287
6.3 信号 290
6.3.1 信号分类 290
6.3.2 数据结构 294
6.3.3 信号产生与发送 302
6.3.4 信号的递交和处理 305
小结 312
第7章 内核活动 313
7.1 中断分类 313
7.1.1 x86的中断和异常 314
7.1.2 后半部机制与软中断 315
7.1.3 中断相关概念的关系 315
7.2 中断处理 316
7.2.1 中断号 317
7.2.2 中断描述符表 320
7.2.3 公共入口 325
7.2.4 异常处理 329
7.3 高层中断处理 332
7.3.1 转向高层处理 333
7.3.2 中断的高层数据结构 336
7.3.3 中断返回处理 342
7.3.4 中断的线程化 349
7.4 中断嵌套与中断管理 350
7.4.1 中断嵌套与中断上下文 350
7.4.2 中断管理 353
7.5 软中断和tasklet 355
7.5.1 中断的下半部 355
7.5.2 软中断执行时机 356
7.5.3 相关数据结构 360
7.5.4 软中断的执行 361
7.5.5 软中断的相关操作 363
7.5.6 tasklet 365
7.6 工作队列 369
7.6.1 工作队列机制 369
7.6.2 cmwq数据结构 371
7.6.3 工作项 371
7.6.4 cmwq工作队列 375
7.6.5 工作者池worker_pool 383
7.6.6 并发度、应急处理等 386
7.7 系统调用 388
7.7.1 POSIX API、C库和系统调用 388
7.7.2 系统调用的实现 389
小结 399
第8章 时间管理 400
8.1 时间管理框架 400
8.1.1 基本概念 400
8.1.2 时间中断和事件 406
8.1.3 clock_event_device与tick_device 407
8.1.4 TIMER_SOFTIRQ软中断 413
8.1.5 timekeeper 414
8.2 定时器 416
8.2.1 低分辨率定时器 416
8.2.2 高精度定时器 419
8.2.3 模拟tick事件 422
8.2.4 通知链技术 423
小结 424
第9章 内核并发与同步 426
9.1 同步的需求 426
9.1.1 内核并发情形 426
9.1.2 内核抢占 429
9.2 内核共享变量的保护 432
9.2.1 被保护对象 432
9.2.2 保护原则 433
9.2.3 禁止内核并发 435
9.3 内核同步手段 437
9.3.1 原子操作 437
9.3.2 自旋锁、读写锁和顺序锁 439
9.3.3 RCU机制 444
9.3.4 顺序和屏障 447
9.3.5 信号量与互斥量 448
9.3.6 等待队列与完成变量 452
9.3.7 每CPU变量 455
小结 458
第二篇 盘根错节的文件系统
第10章 文件系统 461
10.1 文件系统的抽象层次 461
10.1.1 进程视角下的文件 462
10.1.2 VFS虚拟文件系统 468
10.1.3 多角度分层模型 472
10.2 VFS核心对象 475
10.2.1 文件对象 475
10.2.2 目录项对象 479
10.2.3 索引节点对象 484
10.2.4 超级块对象 490
10.3 文件系统类型与挂载 495
10.3.1 文件系统类型与注册 495
10.3.2 挂载操作 503
10.3.3 挂载模式 513
10.3.4 特殊文件系统 519
小结 525
第11章 页缓存和块缓存 526
11.1 页高速缓存 527
11.1.1 address_space 528
11.1.2 页高速缓存的组织 530
11.1.3 反向映射 534
11.2 块高速缓存 540
11.2.1 块缓存 540
11.2.2 LRU块缓存 542
11.2.3 块缓存操作 543
小结 547
第12章 VFS的文件操作 548
12.1 VFS系统调用 548
12.2 open与close系统调用 549
12.2.1 open的框架 549
12.2.2 文件定位过程 552
12.2.3 close系统调用 558
12.3 读写系统调用 558
12.3.1 入口代码 560
12.3.2 通用write写例程 568
12.3.3 通用read读例程 570
12.3.4 其他读写细节 583
12.3.5 向BIO层提交请求 587
小结 588
第13章 ext2文件系统 590
13.1 ext2磁盘数据结构 590
13.1.1 磁盘分区的组织 590
13.1.2 块组描述符和位图 591
13.1.3 盘上和内存数据结构 592
13.2 ext2超级块 593
13.2.1 ext2超级块数据结构 593
13.2.2 挂载与访问 597
13.3 ext2索引节点 598
13.3.1 盘上ext2索引节点 599
13.3.2 内存ext2索引节点 601
13.3.3 inode_operations 603
13.3.4 ext2地址空间与文件操作 604
13.4 目录及目录项 607
13.4.1 ext2_dir_entry 607
13.4.2 ext2_lookup 609
小结 610
第14章 页缓存同步(回写) 611
14.1 同步回写、交换与回收 611
14.2 脏页同步(回写) 613
14.2.1 回写机制演变 613
14.2.2 同步时机与框架 615
14.2.3 基本数据结构 617
14.3 回写接口 627
14.3.1 sync系列系统调用 627
14.3.2 sys_sync 628
14.3.3 sys_syncfs 633
14.3.4 单个文件的同步 635
14.3.5 被动回写 637
14.4 回写工作队列 638
14.4.1 初始化 638
14.4.2 工作队列处理函数 640
14.5 回写操作 643
14.5.1 do_writepages 644
14.5.2 ext2_writepages 645
14.5.3 回写等待 647
小结 649
第15章 内存回收与交换 650
15.1 页帧回收 650
15.1.1 直接释放 650
15.1.2 LRU页帧组织 651
15.1.3 PFRA回收算法 655
15.2 核心回收操作 659
15.2.1 shrink_zone 659
15.2.2 shrink_slab 666
15.2.3 解除页表映射 667
15.3 交换 667
15.3.1 交换功能 668
15.3.2 交换分区 668
15.3.3 交换缓存 673
小结 675
第16章 设备管理 676
16.1 设备管理组织 676
16.1.1 设备驱动模型 677
16.1.2 sysfs 678
16.1.3 基础组件 679
16.1.4 容器 682
16.2 设备的VFS接口 688
16.2.1 设备文件 689
16.2.2 从VFS中访问设备 691
16.3 字符设备 693
16.3.1 设备的散列组织 694
16.3.2 初始化与注册 695
16.3.3 打开字符设备 696
16.4 PCI设备 698
16.4.1 pci_bus_type和pci_bus 699
16.4.2 pci_driver 700
16.4.3 pci_dev 701
16.4.4 uevent 704
小结 705
第17章 块设备 706
17.1 基本概念 706
17.1.1 块设备层 706
17.1.2 传送单位 708
17.2 块设备层组件 709
17.2.1 磁盘与磁盘分区 709
17.2.2 块设备 712
17.2.3 请求队列 715
17.3 提交请求及处理 728
17.3.1 plugunplug机制 728
17.3.2 提交请求 733
17.3.3 提交到驱动程序 742
17.3.4 硬盘的request_fn 744
17.3.5 中断处理 746
17.4 IO调度 749
17.4.1 IO调度器 749
17.4.2 调度器数据结构 751
17.5 初始化及注册 754
17.5.1 块设备初始化 754
17.5.2 硬盘初始化 759
小结 764
附录 765
后记 774
內容試閱 :
序 此书献给所有热爱Linux内核的读者。我们学习它而获得的最大乐趣和收获来源于满足了我们的好奇心。作者最早接触操作系统内核是20世纪90年代初期在西安电子科技大学校园,一个偶然机会获得了一本西安电子科技大学老师写的关于揭秘DOS内核的书籍,如饥似渴地一口气读完,相信一些读者也有过类似的体验。不过很快Windows 3.1、Windows NT来了,可获得的操作系统看似要封闭在一个黑盒子里了。后来在桂林电子科技大学读研的日子里,我知道了Linux这个新东西,不过当时正在研究硬件用VHDL写一个测试控制器,所以并没有深入了解。直到后来在华中科技大学读博士的时候,从浙江大学毛德操老师的《Linux内核源代码情景分析》一书中又找到了当年的感觉。直到前几年遇到一个研究所的年轻人以读过内核而沾沾自喜,于是我觉得应该写一本关于Linux内核的书,降低Linux内核阅读的难度,让它变得平民化一点儿,这就是本书的由来之一。当然更重要的是在陈国良院士的研究团队中,我参与了系统软件的相关工作,这也算是交的一份作业吧。在学习了本科操作系统课程并且对系统编程有一定了解之后,不少同学希望通过Linux源代码的学习来进一步掌握操作系统的细节。但是在操作系统原理和Linux代码之间有明显的学习上的鸿沟,两者之间侧重点的不同使得源代码的学习曲线非常陡峭。操作系统原理性教材以4大管理(处理机、内存、设备和文件)为基线,主要讲述的是原理和算法性的内容,而Linux内核分析的书籍(包括中文和英文)则偏向于解剖代码本身。作者希望做到在讨论How的基础上,力求进一步探究Why,在此思路下并借助类似《Linux内核源代码情景分析》等专著中的方式,本教材选择以主题分析的方式,从应用程序(需求)和操作系统实现两个方面同时入手,力求展现用户编程需求和内核实现的对应关系,除了代码解剖外,加强对各个器官组织之间联系的描述,书中有大量的交叉引用便用于此目的。本教材将现有书籍通常都不在意的概念给读者澄清,从用户进程在物理机器上运行的角度,将源代码大量的细节用提出正确需求问题的形式统领在一起,结合内存模型和时空模型来分析所涉及的问题,将相关原理、过程用图示的直观方法展示给读者,降低了学习难度。本书并不打算替代操作系统原理性教材和源代码分析书籍,读者应当先学习操作系统和系统编程的课程,最好阅读过一两本内核的书籍然后才阅读此书,其间有必要的时候,读者可以进一步研读其他各种源代码分析的专著。此书并不是开天辟地之作,书中许多内容参考了Understanding the Linux Kernel和Professional Linux Kernel Architecture的相关 内容。由于内核代码量非常大,而作者有限的精力和能力难免有理解上的偏差。因此如果读者能在阅读本书过程中快速地建立起比较完整和大体上正确的认识,那将是作者最大的欣慰。对于书中的不足与疏漏,欢迎读者将问题反馈到lqm@szu.edu.cn,您的反馈将可能节约其他读者宝贵的时间,因此极具价值。
罗秋明深大荔园
致谢本书得以完成首先要感谢深圳大学为我提供了一个舒适的工作环境,不必为生计而奔波。也要感谢计算机学院的陈国良院士和明仲院长,他们为本学院老师安排了合理的工作量,从而我能有空闲时间将本书完成。当然,计算机学院高性能计算所的老师们融洽地工作也是我能有精力进行编写的保证。其次要感谢我的几个研究生,肖峰完成了slab机制、文件系统挂载模式等小节的主体内容,周远远、张义军、孔畅、刘国强和刘杰进行了繁重的校对工作。本科学生杨诗达对初稿进行了阅读并协助进行校对。若没有这些同学的帮助,此书将要延迟许久才能与读者见面。最后要感谢我的家人,在我下班回家专心在计算机前写作时,他们毫无怨言。这是对我最大的支持。