描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111666073
(1)本书以三个“面向”为导向,即面向经典基础理论与方法,面向国际前沿研究,面向工业界实践,深入浅出地介绍操作系统的理论、架构、设计方法与具体实现。本书是首本以ARM64为主体介绍操作系统的教材,将学术前沿与工业实践充分结合,不仅介绍了现有的Linux宏内核操作系统架构,而且介绍了微内核、外核等操作系统架构。
(2)本书作者陈海波现为上海交通大学特聘教授、博导,并行与分布式系统研究所所长,领域操作系统教育部工程研究中心主任,国家杰出青年基金获得者,ACM杰出科学家,CCF杰出会员与杰出演讲者,不但有丰富的教学经验,而且在工业界还有丰富的带领团队研发操作系统的经验。因此本书不但介绍了现代操作系统的经典理论与方法,还结合前沿研究与工业界实践,介绍了真实场景下的应用、问题和解决方案。
(3)为了帮助读者更好地理解操作系统的设计与实现,上海交通大学并行与分布式系统研究所团队还专门实现了一个小巧但具有较完整基础功能的微内核架构教学操作系统ChCore,并基于ChCore设计了一系列的课程实验。
(4)本书拥有丰富的教辅材料:在“好大学在线”设置了MOOC课程;建设了课程网站,提供了与课程教学配套的讲义PPT与授课视频;搭建了在线社区,供大家讨论与答疑等。
(5)本书结合作者在工业界长期担任技术和综合面试官的经验,将一些典型的操作系统相关的技术问题融入本书内容以及每章的课后思考题中,既可为工业界从事操作系统相关领域研发工作的专业人员提供参考,又可对希望从事相关领域研发工作的求职者有所帮助。
本书以三个“面向”为导向,即面向经典基础理论与方法,面向国际前沿研究,面向工业界实践,深入浅出地介绍操作系统的理论、架构、设计方法与具体实现。本书是首本以ARM64为主体介绍操作系统的教材,将学术前沿与工业实践充分结合,不仅介绍了现有的Linux宏内核操作系统架构,而且介绍了微内核、外核等操作系统架构。
本书共分为三个部分,其中基础部分(操作系统基础)以纸质版的形式出版,第二部分(操作系统进阶)和第三部分(ChCore课程实验)则以电子版的形式在本书网站发布。基础部分共分为11章,内容包括:操作系统概述、硬件结构、操作系统结构、内存管理、进程与线程、操作系统调度、进程间通信、同步原语、文件系统与存储、设备管理和系统虚拟化。
本书包含大量插图、示例和练习,并融入了典型的操作系统相关的技术问题,既可以作为高等院校计算机专业本科生和研究生的操作系统课程教材,也可以作为工业界从事操作系统相关领域研发工作的专业人员的参考书。
目 录
序言一
序言二
前言
第一部分 操作系统基础
第1章 操作系统概述 2
1.1 简约但不简单:从Hello World说起 2
1.2 什么是操作系统 3
1.3 操作系统简史 6
1.3.1 GM-NAA I/O:第一个(批处理)操作系统 6
1.3.2 OS/360:从专用走向通用 6
1.3.3 Multics/UNIX/Linux:分时与多任务 7
1.3.4 macOS/Windows:以人为本的人机交互 8
1.4 操作系统接口 9
1.5 ChCore:一个简单的实验操作系统 11
参考文献 12
第2章 硬件结构 13
2.1 CPU与指令集架构 14
2.1.1 指令集 14
2.1.2 特权级 15
2.1.3 寄存器 17
2.2 物理内存与CPU缓存 17
2.2.1 缓存结构 18
2.2.2 缓存寻址 19
2.3 设备与中断 20
2.3.1 内存映射输入输出 20
2.3.2 轮询与中断 21
2.4 思考题 22
参考文献 22
第3章 操作系统结构 23
3.1 操作系统的机制与策略 24
3.2 操作系统复杂度管理方法 25
3.3 操作系统内核架构 27
3.3.1 简要结构 27
3.3.2 宏内核架构 28
3.3.3 微内核架构 30
3.3.4 外核架构 32
3.3.5 其他操作系统内核架构 34
3.4 操作系统框架结构 35
3.4.1 Android系统框架 35
3.4.2 ROS系统框架 37
3.5 思考题 39
参考文献 40
第4章 内存管理 42
4.1 虚拟地址与物理地址 43
4.1.1 初识物理地址与虚拟地址 43
4.1.2 使用虚拟地址访问物理内存 44
4.1.3 分段与分页机制 44
4.2 基于分页的虚拟内存 46
4.2.1 AArch64架构下的4级页表 47
4.2.2 加速地址翻译的重要硬件:TLB 49
4.2.3 换页与缺页异常 52
4.2.4 页替换策略 54
4.2.5 工作集模型 57
4.3 虚拟内存功能 58
4.3.1 共享内存 58
4.3.2 写时拷贝 58
4.3.3 内存去重 60
4.3.4 内存压缩 60
4.3.5 大页 61
4.4 物理内存分配与管理 62
4.4.1 目标与评价维度 62
4.4.2 伙伴系统 63
4.4.3 SLAB分配器 65
4.4.4 常用的空闲链表 66
4.4.5 物理内存与CPU缓存 68
4.5 案例分析:ChCore内存管理机制 70
4.6 思考题 73
参考文献 74
第5章 进程与线程 76
5.1 进程 76
5.1.1 进程的状态 76
5.1.2 进程的内存空间布局 78
5.1.3 进程控制块和上下文切换 79
5.2 案例分析:Linux的进程操作 80
5.2.1 进程的创建:fork 80
5.2.2 进程的执行:exec 84
5.2.3 进程管理 85
5.2.4 讨论:fork过时了吗 89
5.3 线程 92
5.3.1 多线程的地址空间布局 93
5.3.2 用户态线程与内核态线程 93
5.3.3 线程控制块与线程本地存储 94
5.3.4 线程的基本接口:以POSIX线程库为例 95
5.4 案例分析:ChCore的线程上下文 99
5.4.1 线程的上下文和TCB 99
5.4.2 ChCore中上下文切换的实现 100
5.5 纤程 102
5.5.1 对纤程的需求:一个简单的例子 103
5.5.2 POSIX的纤程支持:ucontext 103
5.5.3 纤程的上下文切换 105
5.6 思考题 106
参考文献 107
第6章 操作系统调度 108
6.1 计算机调度简介 108
6.1.1 操作系统调度 110
6.1.2 调度指标 111
6.2 调度机制 113
6.2.1 长期、中期与短期调度 114
6.2.2 任务调度总览 116
6.3 单核调度策略 117
6.3.1 经典调度 118
6.3.2 优先级调度 122
6.3.3 公平共享调度 127
6.3.4 实时调度 133
6.3.5 其他调度 138
6.4 多核调度策略 141
6.4.1 负载分担 141
6.4.2 协同调度 142
6.4.3 两级调度 144
6.4.4 负载追踪与负载均衡 145
6.4.5 能耗感知调度 148
6.5 调度进阶机制 151
6.5.1 处理器亲和性 152
6.5.2 调度策略设置 153
6.6 案例分析:现代调度器 155
6.6.1 Linux调度器 155
6.6.2 macOS/iOS调度器 160
6.7 思考题 162
参考文献 163
第7章 进程间通信 165
7.1 进程间通信基础 165
7.1.1 一个简单的进程间通信设计 166
7.1.2 数据传递 167
7.1.3 控制流转移 169
7.1.4 单向和双向 170
7.1.5 同步和异步 170
7.1.6 超时机制 171
7.1.7 通信连接管理 172
7.1.8 权限检查 173
7.1.9 命名服务 174
7.2 宏内核进程间通信 175
7.2.1 管道进程间通信 175
7.2.2 System V消息队列 178
7.2.3 System V信号量 179
7.2.4 System V共享内存 180
7.2.5 信号进程间通信 181
7.2.6 套接字进程间通信 185
7.3 微内核进程间通信 186
7.3.1 Mach:早期的微内核进程间通信设计 186
7.3.2 L4:围绕进程间通信优化而设计的微内核系统 188
7.3.3 LRPC:迁移线程模型 193
7.4 案例分析:Android Binder 195
7.4.1 背景 195
7.4.2 Binder IPC总览 196
7.4.3 Binder IPC内核设计 196
7.4.4 匿名共享内存 199
7.5 案例分析:ChCore 进程间通信机制 201
7.6 思考题 203
参考文献 203
第8章 同步原语 206
8.1 互斥锁 209
8.1.1 临界区问题 209
8.1.2 硬件实现:关闭中断 211
8.1.3 软件实现:皮特森算法 211
8.1.4 软硬件协同:使用原子操作实现互斥锁 213
8.2 条件变量 219
8.2.1 条件变量的使用 219
8.2.2 条件变量的实现 222
8.3 信号量 223
8.3.1 信号量的使用 224
8.3.2 信号量的实现 225
8.4 读写锁 229
8.4.1 读写锁的使用 229
8.4.2 读写锁的实现 230
8.5 RCU 233
8.5.1 订阅/发布机制 234
8.5.2 宽限期 236
8.6 管程 237
8.7 同步带来的问题 239
8.7.1 死锁 239
8.7.2 活锁 245
8.7.3 优先级反转 246
8.8 案例分析:Linux中的futex 249
8.9 案例分析:ChCore中的同步原语 251
8.10 思考题 252
参考文献 254
第9章 文件系统 256
9.1 基于inode的文件系统 257
9.1.1 inode与文件 258
9.1.2 文件名与目录 260
9.1.3 硬链接与符号链接 263
9.1.4 存储布局 264
9.2 虚拟文件系统 266
9.2.1 面向文件系统的接口 266
9.2.2 面向应用程序的接口 270
9.2.3 页缓存、直接I/O与内存映射 277
9.2.4 多种文件系统的组织和管理 280
9.2.5 伪文件系统 282
9.3 其他文件系统 284
9.3.1 FAT文件系统 284
9.3.2 NTFS 288
9.3.3 FUSE与用户态文件系统 292
9.4 案例分析:ChCore文件系统 294
9.4.1 ChCore的文件系统架构 294
9.4.2 内存文件系统 295
9.5 思考题 296
参考文献 297
第10章 设备管理 299
10.1 计算机设备的连接和通信 300
10.1.1 设备的连接:总线 300
10.1.2 可编程I/O 301
10.1.3 高效数据传输:DMA 301
10.1.4 设备地址翻译:IOMMU 302
10.2 设备的识别 303
10.2.1 设备树 303
10.2.2 ACPI 304
10.3 设备的中断处理 305
10.3.1 中断控制器 305
10.3.2 中断的基本概念 306
10.3.3 中断处理:以Linux上下半部的机制为例 308
10.4 设备驱动与设备驱动模型 313
10.4.1 设备驱动 313
10.4.2 设备驱动模型 315
10.5 案例分析:Linux设备驱动模型 315
10.5.1 Linux的设备抽象 315
10.5.2 Linux的设备驱动模型 318
10.5.3 Linux驱动的动态管理 319
10.5.4 Linux的sysfs文件系统 321
10.6 案例分析:L4设备驱动模型 322
10.7 案例分析:Linux的用户态驱动框架 323
10.8 思考题 327
参考文献 327
第11章 系统虚拟化 329
11.1 系统虚拟化技术概述 330
11.1.1 系统虚拟化及其组成部分 330
11.1.2 虚拟机监控器的类型 331
11.2 CPU虚拟化 332
11.2.1 下陷和模拟 333
11.2.2 可虚拟化架构与不可虚拟化架构 333
11.2.3 解释执行 334
11.2.4 动态二进制翻译 335
11.2.5 扫描和翻译 336
11.2.6 半虚拟化技术 337
11.2.7 硬件虚拟化技术 338
11.2.8 小结 340
11.3 内存虚拟化 341
11.3.1 影子页表机制 343
11.3.2 影子页表的缺页异常处理流程 345
11.3.3 直接页表映射机制 345
11.3.4 两阶段地址翻译机制 346
11.3.5 换页和内存气球机制 349
11.3.6 小结 351
11.4 I/O虚拟化 351
11.4.1 软件模拟方法 352
11.4.2 半虚拟化方法 354
11.4.3 设备直通:IOMMU和SR-IOV 356
11.4.4 小结 359
11.5 中断虚拟化 360
11.6 案例分析:QEMU/KVM 361
11.6.1 KVM API和一个简单的虚拟机监控器 362
11.6.2 KVM与QEMU 364
11.6.3 KVM内部实现简介 366
11.7 思考题 367
参考文献 367
缩略语 369
在线章节一
第二部分 操作系统进阶
第12章 多核与多处理器
第13章 文件系统崩溃一致性
第14章 网络协议栈与系统
第15章 轻量级虚拟化
第16章 操作系统安全
第17章 操作系统调测
第18章 形式化证明
第三部分 ChCore课程实验
第19章 实验1:机器启动
第20章 实验2:内存管理
第21章 实验3:用户进程与异常处理
第22章 实验4:多核处理
第23章 实验5:文件系统与Shell
第24章 实验6:进阶实践
为什么又要写一本操作系统的书
操作系统是现代计算平台的基础与核心支撑系统,负责管理硬件资源、控制程序运行、改善人机交互以及为应用软件提供运行环境等。长期以来,我国信息产业处于“缺芯少魂”的状态,作为信息产业之“魂”的操作系统是释放硬件能力、构筑应用生态的基础,也是关键的“卡脖子”技术之一。当前,以华为海思麒麟与鲲鹏处理器、银河飞腾处理器等为代表的ARM平台在智能终端和服务器等应用场景的崛起,以及以开源为特色的RISC-V指令集架构的出现与其生态的蓬勃发展,逐步改变了x86处理器在我国一统天下的局面。因此,需要结合ARM等指令集架构与体系结构来构筑新的操作系统或深入优化现有操作系统,从而充分发挥硬件资源的能力并给用户提供更流畅的体验。
操作系统自20世纪50年代诞生以来,经历了从专用操作系统(每个主机与应用场景均需要一个新的操作系统)到通用操作系统(如Windows、UNIX、Linux等,即一个操作系统覆盖很多场景)的转变。在PC时代,由于Windows操作系统的广泛应用与部署,微软于20世纪90年代成为全球市值最高的公司,苹果研制的macOS也支撑苹果一度成为全球最赚钱的科技公司。在数据中心时代,在IBM、Intel等企业的支持下,Linux操作系统又逐步在服务器等场景占据主体地位。在移动互联网时代,苹果在乔布斯回归后基于NeXTSTEP操作系统构筑的iOS、新型macOS、iPadOS、watchOS、tvOS等操作系统支撑苹果又成为当时全球市值最高的科技公司。谷歌于2005年收购了Andrew Rubin于2003年创立的Android公司,并通过持续不断的压强投入逐步将Android操作系统打造成世界上发行量最大的移动智能操作系统。
当前,随着智能终端的多样化,5G带来的大连接、低时延、高吞吐,以及异构硬件设备的繁荣发展,我们正在逐步进入万物互联的智能世界,覆盖所有场景的单一操作系统已经很难发挥出硬件的处理能力并满足应用越来越高的极限需求。当前,华为、阿里、微软、谷歌、Facebook等各大企业纷纷在操作系统领域投入重兵。例如,微软在Windows 10之后开始研制Windows CoreOS,谷歌从2016年开始投入Fuchsia项目,Facebook从2019年开始研制面向AR/VR等的新OS,华为也于2019年发布鸿蒙操作系统并与合作伙伴一起构建openEuler、openHarmony开源社区和华为移动服务(Huawei Mobile Service,HMS)生态。
操作系统的复兴也对教学科研与产业实践提出了新的要求。首先,操作系统教材需要体现操作系统的核心原理与设计,从而帮助读者建立对操作系统的系统性认识;其次,操作系统教材需要反映国际的研究前沿,当前操作系统技术仍在迅猛发展,很多新的问题随着新处理器、新加速器架构、新应用场景的出现而不断涌现,同样,很多经典的问题也会出现新的解决方法,这些都给操作系统的设计与实现提供了新的思路;最后,操作系统教材需要反映工业界实践,操作系统是一门系统性与实践性非常强的学科,脱离实现来谈设计很容易陷入纸上谈兵的陷阱。当前操作系统领域的前沿研究与工业界实践结合得越来越紧密,在工业界新应用场景与需求的推动下,研究人员将前沿研究应用到工业界实践,再由工业界实践反馈进一步推动前沿研究,从而形成了良好的循环,并且循环的速度越来越快。
当前国内外已经出版了一系列优秀的操作系统教材,例如美国威斯康辛大学麦迪逊分校的Remzi H. Arpaci-Dusseau和Andrea C. Arpaci-Dusseau两位教授的Operating Systems: Three Easy Pieces,Abraham Silberschatz、Peter B. Galvin和Greg Gagne的Operating System Concepts。然而,笔者从当前学术研究前沿和工业界实践的角度来看,一些经典的教材缺乏对当前研究前沿的体现,另一些教材仅关注操作系统的概念而缺乏充分的实践环节。此外,大部分教材是以x86体系为主导,缺乏对当前已广泛流行的ARM等体系结构的描述;这些教材也基本以Linux/UNIX等宏内核架构的操作系统为主,缺乏对当前新兴而又经典的微内核架构等系统的深入介绍。
本书将以三个“面向”为导向,即面向经典基础理论与方法,面向国际前沿研究,面向最新工业界实践,深入浅出地介绍操作系统的理论、架构、设计方法与具体实现。对于每项要介绍的内容,本书将从一个具体的操作系统设计问题出发,解释这个问题背后的挑战,给出当前的经典设计,并介绍当前的一些工业界实践与前沿研究。本书不仅介绍典型的Linux操作系统的设计与实现,还将介绍微内核(Microkernel)、外核(Exokernel)等操作系统架构。此外,为了帮助读者更好地理解操作系统的设计与实现,除了本书中介绍的各种操作系统的设计与实现外,上海交通大学并行与分布式系统研究所团队还专门实现了一个小巧但具有较完整基础功能的微内核架构教学操作系统ChCore,并基于ChCore设计了一系列的课程实验。因此,本书期望不仅从理论上具体讲解操作系统的设计与实现,而且能够帮助读者通过动手实践的方式获得操作系统设计与实现的第一手经验。
致使用本书的实践人员
非常感谢您选用本书来了解操作系统的设计与实现!
本书试图通过介绍现代操作系统的设计与实现,为开发、设计、优化与维护操作系统的管理人员、开发人员和维护人员提供基础的概念以及典型的操作系统组件的实现,帮助相关人员快速上手。本书还将结合作者在工业界带领团队研发操作系统的经验,介绍操作系统在典型场景下的实践,并将实践中遇到的一些问题在本书中以多种形式展现。同时,本书还将结合作者做操作系统研究时的一些理解,介绍常见操作系统问题的前沿研究,从而为使用本书的实践人员解决一些真实场景问题提供参考。此外,本书结合作者在工业界长期担任技术和综合面试官的经验,将一些典型的操作系统相关的技术问题融入本书内容以及每章的课后思考题中,以期为在工业界从事操作系统相关领域研发工作的专业人员提供参考。
致使用本书的指导老师
非常感谢您选用本书来讲授操作系统的设计与实现!
由于各学校对操作系统课程的难度要求和教学时长不同,本书将所涉及的内容分为3个等级:基础性内容;较为深入的内容;较为前沿的内容,包含一些工业界的最新实践与国际研究的前沿。各位老师可以根据不同的要求选择各种组合,从而适应各自的教学需要。
本书作者从2009年开始,先后在复旦大学、上海交通大学讲授操作系统课程。本书也融入了作者对教学过程中遇到的一些问题的思考。为了方便各位老师使用本书进行教学,我们还在“好大学在线”设置了MOOC课程,并且建设了课程网站,提供了与课程教学配套的讲义PPT与授课视频,供各位老师参考。本书还搭建了在线社区,供大家讨论与答疑等。
致使用本书的学生
非常感谢您选用本书作为学习操作系统的教材!
我们提供了本书所涉及内容的课程教学PPT、MOOC课程等,希望能供各位预习和复习。此外,思考题不仅有助于进一步巩固所学知识,还综合了作者在工作中以及面试中遇到的常见问题,希望能对各位进一步深入思考操作系统的设计与实现以及后续求职有所帮助。
本书设计的五个课程实验提供了框架代码,由读者去实现其中的关键部分,以加深对操作系统的理解,并且为之后从事计算机系统相关领域的工作和研究打下基础。课程实验采用C语言,并且面向ARM64体系结构(即手机平台最常用的体系结构,也用于华为MateBook的部分型号与苹果后续的MacBook),从而帮助各位了解一个现代操作系统的设计与实现。其中,前四个课程实验实现较为基础的操作系统功能,第五个课程实验实现更具挑战性的功能,读者可以根据自身情况与需要选择不同的课程实验进行实践。
发布方式与版权声明
本书的内容采用电子版和纸质版两种形式。本书的第一部分(操作系统基础)由机械工业出版社以纸质版的形式出版,第二部分(操作系统进阶)以及第三部分(ChCore课程实验)则以电子版的形式在本书网站发布。本书电子版将采用持续发布的模式,根据读者的反馈、作者的持续优化进行定期与不定期更新,购买了本书纸质版的读者可以及时获得本书电子版以及本书的课件、视频与考试资料的更新。本书电子版以及相关课件的版权归上海交通大学并行与分布式系统研究所所有,发布遵守Creative Commons Attribution 4.0 License(完整文本请参阅https://creativecommons.org/licenses/by/4.0/legalcode),读者可以将本书的全部或部分内容免费用于非商业用途,但在使用本书内容时请注明来源,即“内容来自:上海交通大学并行与分布式系统研究所 材料名称”。对于不遵守此声明或者其他违法使用本书内容者,我们将依法保留追究其侵权责任的权利。
致谢
本书的提纲和主要内容基于作者多年来在复旦大学和上海交通大学所讲授的操作系统课程。写作时,首先由陈海波和夏虞斌两位老师确定了本书的整体结构以及各个章节的大纲,然后部分章节由上海交通大学并行与分布式系统研究所及领域操作系统教育部工程研究中心的老师和博士研究生扩展形成初稿,再通过交叉评审、每周迭代的方式逐步完成。具体而言,本书每章的主要贡献者包括:本书的前言、第1章(操作系统概述)、第3章(操作系统结构)由陈海波等完成;第2章(硬件结构)由沈斯杰等完成;第4章(内存管理)由古金宇等完成;第5章(进程与线程)由吴明瑜等完成;第6章(操作系统调度)由董致远等完成;第7章(进程间通信)由杜东等完成;第8章(同步原语)与第12章(多核与多处理器)由刘年等完成;第9章(文件系统)与第13章(文件系统崩溃一致性)由董明凯等完成;第10章(设备管理)与第14章(网络协议栈与系统)由李明煜等完成;第11章(系统虚拟化)由糜泽羽等完成;第15章(轻量级虚拟化)由易纪非等完成;第16章(操作系统安全)由夏虞斌等完成;第17章(操作系统调测)由李文泰等完成;第18章(形式化证明)由邹沫和丁浩然等完成。ChCore课程实验由本课程的助教完成:第19章(Lab1:机器启动)由沈斯杰完成;第20章(Lab2:内存管理)由冯二虎完成;第21章(Lab3:用户进程与异常处理)由赵子铭完成;第22章(Lab4:多核处理)由董致远完成;第23章(Lab5:文件系统与Shell)由沈斯杰完成。陈榕负责全书图片的美化,陈海波与夏虞斌负责整体内容的审核。
本书的完成离不开很多人的支持!很多学术界与工业界的专家通过各种形式提供了很多反馈意见。我们要感谢上海交通大学并行与分布式系统研究所的各位老师和同学;感谢上海交通大学操作系统课程的助教和同学们提供的各种资料与反馈,包括董本超、路旭、江学强、李新锐、胡雨奇、唐楚哲、彭许红、袁楚宏、钱宇超、同睿哲、袁澍民、蔡忠玮、杨帆、杨雁飞、华志超、徐天强、庄浩麒、卢军、黄逸博、王帅惟、林亦辰、吴新月、谢夏婷、王子轩、熊济凡、杨璧丞、余天依、朱伯君、张云昊等;感谢华为操作系统内核实验室各位技术专家提供的意见与支持,包括王楠、李雨、李海程、缪勰、张殿芳、贾宁、钱梽杨、郭寒军、魏勇军、王飞、李坤、马久跃、洪扬、王强、高欣等,以及华为庞加莱实验室的胡欣蔚等。(排名不分先后。)
本书还在不断演进和完善中。每一章的最后都附了反馈二维码,若有任何建议与意见,欢迎扫描二维码进行反馈,我们会在后续的版本中感谢提出宝贵意见的读者。
评论
还没有评论。