本书由FreeBSD系统的三位引领者撰写,在上一版基础上做了大幅更新,涵盖FreeBSD 5和FreeBSD 11之间的所有重大改进,如使用FreeBSD Jail的高度可扩展和轻量级虚拟化、使用Xen和Virtio设备半虚拟化的虚拟机加速、Capsicum沙箱和GELI加密磁盘保护以及DTrace内核调试技巧等。全书从接口到内核再到硬件逐层深入,详细阐述实现每个重要系统组件——进程管理、安全、虚拟内存、I/O系统、文件系统、socket IPC和网络等——所使用的概念、数据结构和算法。本书可以作为高等院校操作系统相关课程的教材或参考书,也可以作为系统开发人员和管理人员的学习指南。
本书是Marshall Kirk McKusick、George V. Neville-Neil、Robert N. M. Watson三位FreeBSD系统引领者的倾力巨著。Marshall Kirk McKusick实现了4.2BSD快速文件系统,并负责监督4.3BSD和4.4BSD的开发与发布。George V. Neville-Neil编写了安全、网络和操作系统相关的许多资料。Robert N. M. Watson为FreeBSD核心团队服务了10年之久,并且当了15年贡献者。他们三位作为FreeBSD基金会的董事会成员,为FreeBSD的不断发展和演进做出了巨大贡献。
FreeBSD始于1993年,经过近30年的发展,已经成为世界上非常重要的操作系统之一。当前有很多公司的核心平台在使用FreeBSD操作系统,FreeBSD的一些设计思想和理念也深刻影响着操作系统世界。
目录
- 译者序
- 前言
- 作者简介
- 第一部分概述
- 第1章BSD系统的历史和目标2
- 1.1UNIX系统的历史2
- 1.1.1UNIX系统的起源2
- 1.1.2Research小组的UNIX系统3
- 1.1.3AT&T UNIX System Ⅲ和System V4
- 1.1.4伯克利软件发布5
- 1.1.5UNIX无处不在6
- 1.2BSD和其他系统6
- 1.3BSD向开放源代码的转变8
- 1.3.1Networking Release 28
- 1.3.2法律诉讼10
- 1.3.34.4BSD11
- 1.3.44.4BSD-Lite Release 211
- 1.4FreeBSD的开发模式12
- 第2章FreeBSD设计概述16
- 2.1FreeBSD的功能和内核16
- 2.2内核结构17
- 2.3内核服务20
- 2.4进程管理21
- 2.4.1信号22
- 2.4.2进程组和会话23
- 2.5安全23
- 2.5.1进程凭证24
- 2.5.2特权模型25
- 2.5.3自主访问控制25
- 2.5.4能力模型25
- 2.5.5Jail轻型虚拟化26
- 2.5.6强制访问控制27
- 2.5.7事件审计27
- 2.5.8密码学与随机数生成器28
- 2.6内存管理28
- 2.6.1BSD内存管理设计要点29
- 2.6.2内核中的内存管理30
- 2.7I/O系统概述31
- 2.7.1描述符与I/O31
- 2.7.2描述符管理33
- 2.7.3设备34
- 2.7.4套接字IPC34
- 2.7.5分散-收集I/O35
- 2.7.6多文件系统支持35
- 2.8设备36
- 2.9快速文件系统36
- 2.10Zettabyte文件系统40
- 2.11网络文件系统41
- 2.12进程间通信41
- 2.13网络层协议42
- 2.14传输层协议43
- 2.15系统启动和停止43
- 习题44
- 第3章内核服务45
- 3.1内核结构45
- 3.1.1系统进程45
- 3.1.2系统入口46
- 3.1.3运行时的内核结构46
- 3.1.4内核的入口48
- 3.1.5从内核返回49
- 3.2系统调用49
- 3.2.1调用结果的处理49
- 3.2.2从系统调用返回50
- 3.3陷阱和中断51
- 3.3.1I/O设备中断51
- 3.3.2软件中断51
- 3.4时钟中断52
- 3.4.1统计和进程调度53
- 3.4.2超时54
- 3.5内存管理服务55
- 3.6时间服务58
- 3.6.1真实时间59
- 3.6.2外部表示59
- 3.6.3调整时间59
- 3.6.4时间间隔60
- 3.7资源服务60
- 3.7.1进程优先级60
- 3.7.2资源利用61
- 3.7.3资源限制61
- 3.7.4文件系统配额62
- 3.8内核跟踪工具62
- 3.8.1系统调用跟踪62
- 3.8.2DTrace63
- 3.8.3内核跟踪66
- 习题68
- 第二部分进程
- 第4章进程管理70
- 4.1进程管理概述70
- 4.1.1多道程序设计71
- 4.1.2调度72
- 4.2进程状态73
- 4.2.1进程结构75
- 4.2.2线程结构78
- 4.3上下文切换79
- 4.3.1线程状态79
- 4.3.2底层上下文切换80
- 4.3.3主动上下文切换80
- 4.3.4同步84
- 4.3.5互斥锁同步85
- 4.3.6互斥锁接口87
- 4.3.7锁同步88
- 4.3.8死锁预防89
- 4.4线程调度91
- 4.4.1低级调度器91
- 4.4.2线程运行队列和上下文切换92
- 4.4.3分时线程调度93
- 4.4.4多处理器调度98
- 4.4.5自适应空闲100
- 4.4.6传统的分时线程调度100
- 4.5创建进程101
- 4.6终止进程102
- 4.7信号103
- 4.7.1发送信号106
- 4.7.2传输信号108
- 4.8进程组和会话110
- 4.8.1进程组110
- 4.8.2会话111
- 4.8.3作业控制112
- 4.9进程的调试114
- 习题116
- 第5章安全性118
- 5.1操作系统安全119
- 5.2安全模型120
- 5.2.1进程模型120
- 5.2.2自主与强制访问控制120
- 5.2.3可信计算基121
- 5.2.4其他内核安全特性121
- 5.3进程凭证121
- 5.3.1凭证结构122
- 5.3.2凭证内存模型123
- 5.3.3访问控制校验124
- 5.4用户和组124
- 5.5特权模型126
- 5.5.1隐式特权127
- 5.5.2显式特权127
- 5.6进程间访问控制128
- 5.6.1可见性129
- 5.6.2信号129
- 5.6.3调度控制129
- 5.6.4等待进程终止130
- 5.6.5调试130
- 5.7自主访问控制130
- 5.7.1虚拟文件系统接口与DAC131
- 5.7.2对象属主与组132
- 5.7.3UNIX权限132
- 5.7.4访问控制列表134
- 5.7.5POSIX.1e访问控制列表136
- 5.7.6NFSv4访问控制列表138
- 5.8Capsicum能力模型141
- 5.8.1Capsicum应用体系结构142
- 5.8.2能力系统142
- 5.8.3能力143
- 5.8.4能力模型145
- 5.9Jail146
- 5.10强制访问控制框架151
- 5.10.1强制策略151
- 5.10.2设计的指导原则152
- 5.10.3MAC框架的体系结构153
- 5.10.4启动框架154
- 5.10.5策略注册155
- 5.10.6框架入口点设计考量155
- 5.10.7策略入口点设计考量156
- 5.10.8内核服务入口点调用157
- 5.10.9策略组合158
- 5.10.10给对象打标签159
- 5.10.11标签的生命周期与存储管理159
- 5.10.12标签同步162
- 5.10.13从用户空间进行策略无关的标签管理163
- 5.11安全事件审计163
- 5.11.1审计事件与记录164
- 5.11.2BSM审计记录与审计跟踪165
- 5.11.3内核审计的实现166
- 5.12加密服务168
- 5.12.1加密框架168
- 5.12.2随机数生成器170
- 5.13GELI全磁盘加密173
- 5.13.1机密性和完整性保护173
- 5.13.2密钥管理174
- 5.13.3启动GELI174
- 5.13.4加密块保护175
- 5.13.5I/O模型176
- 5.13.6不足176
- 习题177
- 第6章存储管理178
- 6.1术语178
- 6.1.1进程与内存179
- 6.1.2调页机制180
- 6.1.3替换算法180
- 6.1.4工作集模型181
- 6.1.5交换机制181
- 6.1.6虚拟内存的优点182
- 6.1.7虚拟内存的硬件要求182
- 6.2FreeBSD 虚拟内存系统概述183
- 6.3内核的存储管理185
- 6.3.1内核映射和子映射186
- 6.3.2内核地址空间的分配188
- 6.3.3slab分配器190
- 6.3.4keg分配器191
- 6.3.5zone分配器192
- 6.3.6内核malloc194
- 6.3.7内核zone分配器196
- 6.4进程独立拥有的资源197
- 6.4.1FreeBSD的进程虚拟地址空间197
- 6.4.2缺页处理199
- 6.4.3映射到vm_object199
- 6.4.4vm_object201
- 6.4.5vm_object到页面201
- 6.5共享内存202
- 6.5.1mmap模型203
- 6.5.2共享映射205
- 6.5.3私有映射205
- 6.5.4压缩影子链207
- 6.5.5私有快照208
- 6.6创建新进程209
- 6.6.1预留内核资源210
- 6.6.2复制用户地址空间211
- 6.6.3不通过复制创建新进程211
- 6.7执行一个文件212
- 6.8操作进程地址空间213
- 6.8.1改变进程大小213
- 6.8.2文件映射214
- 6.8.3改变保护权限215
- 6.9终止进程215
- 6.10调页器接口216
- 6.10.1vnode调页器218
- 6.10.2设备调页器219
- 6.10.3物理内存调页器220
- 6.10.4交换调页器221
- 6.11调页机制224
- 6.11.1硬件高速缓存的设计228
- 6.11.2硬件内存管理229
- 6.11.3超级页231
- 6.12页面替换235
- 6.12.1调页参数237
- 6.12.2pageout守护进程237
- 6.12.3交换机制240
- 6.12.4换入进程242
- 6.13可移植性243
- 6.13.1pmap模块的作用243
- 6.13.2初始化和启动245
- 6.13.3分配和释放映射248
- 6.13.4改变映射的访问和wiring属性249
- 6.13.5物理页面使用信息的维护251
- 6.13.6初始化物理页面251
- 6.13.7管理内部数据结构252
- 习题252
- 第三部分I/O系统
- 第7章I/O系统概述256
- 7.1描述符管理和服务257
- 7.1.1打开文件条目258
- 7.1.2描述符管理260
- 7.1.3异步I/O261
- 7.1.4文件描述符锁261
- 7.1.5描述符的多路I/O复用263
- 7.1.6select的实现265
- 7.1.7kqueue和kevent267
- 7.1.8数据在内核中的迁移269
- 7.2本地进程间交互270
- 7.2.1信号量272
- 7.2.2消息队列273
- 7.2.3共享内存274
- 7.3虚拟文件接口275
- 7.3.1vnode的内容275
- 7.3.2vnode的操作277
- 7.3.3路径名的转换278
- 7.3.4导出文件系统服务278
- 7.4独立于文件系统的服务279
- 7.4.1名字缓存281
- 7.4.2缓冲区管理282
- 7.4.3缓冲区管理的实现284
- 7.5可堆叠的文件系统285
- 7.5.1简单的文件系统层287
- 7.5.2联合文件系统288
- 7.5.3其他文件系统290
- 习题291
- 第8章设备292
- 8.1设备概述292
- 8.1.1PC I/O体系结构293
- 8.1.2FreeBSD大容量存储I/O子系统的结构295
- 8.1.3设备命名和访问296
- 8.2从用户到设备的I/O映射297
- 8.2.1设备驱动程序298
- 8.2.2I/O队列299
- 8.2.3中断处理299
- 8.3字符设备299
- 8.3.1原始设备和物理I/O301
- 8.3.2面向字符的设备302
- 8.3.3字符设备驱动程序入口点302
- 8.4磁盘设备303
- 8.4.1磁盘设备驱动程序入口点303
- 8.4.2磁盘I/O请求排序303
- 8.4.3磁盘标签304
- 8.5网络设备305
- 8.5.1网络设备驱动程序入口点306
- 8.5.2配置与控制306
- 8.5.3数据包接收307
- 8.5.4数据包传输309
- 8.6终端处理309
- 8.6.1终端处理模式310
- 8.6.2用户接口312
- 8.6.3进程组、会话和终端控制313
- 8.6.4终端操作313
- 8.6.5终端输出(上半部分)314
- 8.6.6终端输出(下半部分)315
- 8.6.7终端输入315
- 8.6.8关闭终端设备316
- 8.7GEOM层316
- 8.7.1术语和拓扑规则317
- 8.7.2改变拓扑318
- 8.7.3操作320
- 8.7.4拓扑灵活性321
- 8.8CAM层322
- 8.8.1通过CAM子系统的SCSI I/O请求的路径323
- 8.8.2ATA磁盘325
- 8.9设备配置325
- 8.9.1设备标识327
- 8.9.2自动配置数据结构329
- 8.9.3资源管理333
- 8.10设备虚拟化334
- 8.10.1与虚拟机监控程序的交互335
- 8.10.2Virtio336
- 8.10.3Xen339
- 8.10.4设备直通346
- 习题346
- 第9章快速文件系统348
- 9.1分层文件系统管理348
- 9.2inode结构350
- 9.2.1inode格式的改变351
- 9.2.2扩展属性352
- 9.2.3新的文件系统功能354
- 9.2.4文件标志355
- 9.2.5动态inode356
- 9.2.6inode管理357
- 9.3命名359
- 9.3.1目录359
- 9.3.2在目录中查找名称360
- 9.3.3路径名转换362
- 9.3.4链接363
- 9.4配额365
- 9.5文件锁定368
- 9.6软更新372
- 9.6.1在文件系统中的更新依赖373
- 9.6.2依赖的结构376
- 9.6.3位图依赖跟踪378
- 9.6.4inode依赖跟踪378
- 9.6.5直接块依赖跟踪379
- 9.6.6间接块依赖跟踪380
- 9.6.7新间接块的依赖跟踪381
- 9.6.8新目录入口的依赖跟踪382
- 9.6.9新目录依赖跟踪384
- 9.6.10目录入口移除依赖项跟踪385
- 9.6.11文件截断385
- 9.6.12文件和目录inode回收385
- 9.6.13目录入口重命名依赖关系跟踪386
- 9.6.14软更新的fsync请求386
- 9.6.15软更新的文件删除要求387
- 9.6.16fsck的软更新要求389
- 9.7文件系统快照389
- 9.7.1创建一个文件系统快照389
- 9.7.2维护文件系统快照391
- 9.7.3大文件系统快照392
- 9.7.4后台fsck393
- 9.7.5用户可见的快照394
- 9.7.6实时转储394
- 9.8日志软更新394
- 9.8.1背景和简介395
- 9.8.2与其他实现的兼容性395
- 9.8.3日志格式395
- 9.8.4需要日志记录的修改396
- 9.8.5日志的额外需求397
- 9.8.6恢复进程398
- 9.8.7性能399
- 9.8.8未来工作400
- 9.8.9跟踪文件移除依赖400
- 9.9本地文件存储402
- 9.9.1文件存储概述402
- 9.9.2用户I/O到一个文件的过程404
- 9.10伯克利快速文件系统406
- 9.10.1伯克利快速文件系统的组织406
- 9.10.2启动块408
- 9.10.3优化存储利用率408
- 9.10.4对文件进行读写409
- 9.10.5布局策略411
- 9.10.6分配机制413
- 9.10.7块聚类416
- 9.10.8基于分区的分配418
- 习题419
- 第10章Zettabyte文件系统421
- 第11章网络文件系统422
- 11.1概述422
- 11.2结构和操作424
- 11.2.1FreeBSD NFS的实现428
- 11.2.2客户端-服务器端交互432
- 11.2.3安全问题432
- 11.2.4性能提升技巧433
- 11.3NFS演进435
- 11.3.1命名空间439
- 11.3.2属性440
- 11.3.3访问控制列表441
- 11.3.4缓存、代理和回调441
- 11.3.5锁447
- 11.3.6安全448
- 11.3.7崩溃恢复450
- 习题451
- 第四部分进程间通信
- 第12章进程间通信454
- 12.1进程间交互模型454
- 12.2实现结构和概述458
- 12.3内存管理460
- 12.3.1mbuf460
- 12.3.2存储管理算法463
- 12.3.3mbuf实用例程463
- 12.4IPC数据结构464
- 12.4.1套接字地址468
- 12.4.2锁469
- 12.5建立连接469
- 12.6数据传输471
- 12.6.1传输数据471
- 12.6.2接收数据473
- 12.7关闭套接字475
- 12.8网络通信协议的内部结构476
- 12.8.1数据流477
- 12.8.2通信协议478
- 12.9套接字到协议接口480
- 12.9.1用户请求协议例程481
- 12.9.2控制输出协议例程483
- 12.10协议到协议的接口484
- 12.10.1pr_output484
- 12.10.2pr_input485
- 12.10.3pr_ctlinput485
- 12.11协议到网络的接口486
- 12.11.1网络接口和链路层协议486
- 12.11.2数据包传输492
- 12.11.3数据包接收492
- 12.12缓冲和流控493
- 12.12.1缓冲协议策略494
- 12.12.2队列限制494
- 12.13网络虚拟化494
- 习题496
- 第13章网络层协议498
- 13.1IPv4498
- 13.1.1IPv4地址500
- 13.1.2广播地址501
- 13.1.3Internet组播502
- 13.1.4链路层地址解析503
- 13.2ICMP504
- 13.3IPv6506
- 13.3.1IPv6地址507
- 13.3.2IPv6数据包格式509
- 13.3.3切换到套接字API510
- 13.3.4自动配置511
- 13.4Internet协议代码结构515
- 13.4.1输出515
- 13.4.2输入517
- 13.4.3转发518
- 13.5路由519
- 13.5.1内核路由表520
- 13.5.2路由选择查询522
- 13.5.3路由选择重定向525
- 13.5.4路由表接口525
- 13.5.5用户级路由选择策略526
- 13.5.6用户级路由选择接口:路由选择套接字526
- 13.6原始套接字527
- 13.6.1控制块528
- 13.6.2输入处理528
- 13.6.3输出处理529
- 13.7安全529
- 13.7.1IPSec概述530
- 13.7.2安全协议531
- 13.7.3密钥管理533
- 13.7.4IPSec实现537
- 13.8数据包处理框架539
- 13.8.1伯克利数据包过滤器539
- 13.8.2IP防火墙540
- 13.8.3IPFW和Dummynet541
- 13.8.4数据包过滤器544
- 13.8.5netgraph545
- 13.8.6netmap549
- 习题551
- 第14章传输层协议553
- 14.1Internet端口与关联553
- 14.2用户数据报协议554
- 14.2.1初始化555
- 14.2.2输出555
- 14.2.3输入555
- 14.2.4控制操作556
- 14.3传输控制协议556
- 14.3.1TCP连接状态558
- 14.3.2序列变量561
- 14.4TCP算法562
- 14.4.1定时器563
- 14.4.2往返时间的估计565
- 14.4.3建立连接565
- 14.4.4SYN缓存567
- 14.4.5SYN cookie568
- 14.4.6关闭连接569
- 14.5TCP输入处理569
- 14.6TCP输出处理572
- 14.6.1发送数据573
- 14.6.2避免糊涂窗口综合征573
- 14.6.3避免小数据包574
- 14.6.4延迟确认与窗口更新575
- 14.6.5选择性确认575
- 14.6.6重传状态577
- 14.6.7慢启动578
- 14.6.8缓冲区与窗口大小579
- 14.6.9使用慢启动进行拥塞避免580
- 14.6.10快速重传581
- 14.6.11模块化拥塞控制582
- 14.6.12Vegas算法584
- 14.6.13Cubic算法584
- 14.7流控制传输协议585
- 14.7.1大数据块585
- 14.7.2关联建立586
- 14.7.3数据传输587
- 14.7.4关联关闭589
- 14.7.5多宿主和心跳589
- 习题591
- 第五部分系统运行
- *第15章系统启动与关闭594
- *术语表
- *参考文献