求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。

FreeBSD操作系统设计与实现查看源代码讨论查看历史

跳转至: 导航搜索

来自 孔夫子网 的图片

FreeBSD操作系统设计与实现》,[美] 罗伯特·N.M.沃森著;(美)马 著,[美] 罗伯特·N.M.沃森著;(美)马 编,出版社: 机械工业出版社。

机械工业出版社成立于1950年,是建国后国家设立的第一家科技出版社,前身为科学技术出版社,1952年更名为机械工业出版社[1]。机械工业出版社(以下简称机工社)由机械工业信息研究院作为主办单位,目前隶属于国务院国资委[2]

内容简介

本书由FreeBSD系统的三位引领者撰写,在上一版基础上做了大幅更新,涵盖FreeBSD 5和FreeBSD 11之间的所有重大改进,如使用FreeBSD Jail的高度可扩展和轻量级虚拟化、使用Xen和Virtio设备半虚拟化的虚拟机加速、Capsicum沙箱和GELI加密磁盘保护以及DTrace内核调试技巧等。全书从接口到内核再到硬件逐层深入,详细阐述实现每个重要系统组件——进程管理、安全、虚拟内存、I/O系统、文件系统、socket IPC和网络等——所使用的概念、数据结构和算法。本书可以作为高等院校操作系统相关课程的教材或参考书,也可以作为系统开发人员和管理人员的学习指南。

目录

译者序

前言

作者简介

第一部分 概述

第1章 BSD系统的历史和目标 2

1.1 UNIX系统的历史 2

1.1.1 UNIX系统的起源 2

1.1.2 Research小组的UNIX系统 3

1.1.3 AT&T UNIX System Ⅲ和System V 4

1.1.4 伯克利软件发布 5

1.1.5 UNIX无处不在 6

1.2 BSD和其他系统 6

1.3 BSD向开放源代码的转变 8

1.3.1 Networking Release 28

1.3.2 法律诉讼 10

1.3.3 4.4BSD 11

1.3.4 4.4BSD-Lite Release 211

1.4 FreeBSD的开发模式 12

第2章 FreeBSD设计概述 16

2.1 FreeBSD的功能和内核 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.5 Jail轻型虚拟化 26

2.5.6 强制访问控制 27

2.5.7 事件审计 27

2.5.8 密码学与随机数生成器 28

2.6 内存管理 28

2.6.1 BSD内存管理设计要点 29

2.6.2 内核中的内存管理 30

2.7 I/O系统概述 31

2.7.1 描述符与I/O 31

2.7.2 描述符管理 33

2.7.3 设备 34

2.7.4 套接字IPC 34

2.7.5 分散-收集I/O 35

2.7.6 多文件系统支持 35

2.8 设备 36

2.9 快速文件系统 36

2.10 Zettabyte文件系统 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.1 I/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.2 DTrace 63

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 虚拟文件系统接口与DAC 131

5.7.2 对象属主与组 132

5.7.3 UNIX权限 132

5.7.4 访问控制列表 134

5.7.5 POSIX.1e访问控制列表 136

5.7.6 NFSv4访问控制列表 138

5.8 Capsicum能力模型 141

5.8.1 Capsicum应用体系结构 142

5.8.2 能力系统 142

5.8.3 能力 143

5.8.4 能力模型 145

5.9 Jail 146

5.10 强制访问控制框架 151

5.10.1 强制策略 151

5.10.2 设计的指导原则 152

5.10.3 MAC框架的体系结构 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.2 BSM审计记录与审计跟踪 165

5.11.3 内核审计的实现 166

5.12 加密服务 168

5.12.1 加密框架 168

5.12.2 随机数生成器 170

5.13 GELI全磁盘加密 173

5.13.1 机密性和完整性保护 173

5.13.2 密钥管理 174

5.13.3 启动GELI 174

5.13.4 加密块保护 175

5.13.5 I/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.2 FreeBSD 虚拟内存系统概述 183

6.3 内核的存储管理 185

6.3.1 内核映射和子映射 186

6.3.2 内核地址空间的分配 188

6.3.3 slab分配器 190

6.3.4 keg分配器 191

6.3.5 zone分配器 192

6.3.6 内核malloc 194

6.3.7 内核zone分配器 196

6.4 进程独立拥有的资源 197

6.4.1 FreeBSD的进程虚拟地址空间 197

6.4.2 缺页处理 199

6.4.3 映射到vm_object 199

6.4.4 vm_object 201

6.4.5 vm_object到页面 201

6.5 共享内存 202

6.5.1 mmap模型 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.1 vnode调页器 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.2 pageout守护进程 237

6.12.3 交换机制 240

6.12.4 换入进程 242

6.13 可移植性 243

6.13.1 pmap模块的作用 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/O 261

7.1.4 文件描述符锁 261

7.1.5 描述符的多路I/O复用 263

7.1.6 select的实现 265

7.1.7 kqueue和kevent 267

7.1.8 数据在内核中的迁移 269

7.2 本地进程间交互 270

7.2.1 信号量 272

7.2.2 消息队列 273

7.2.3 共享内存 274

7.3 虚拟文件接口 275

7.3.1 vnode的内容 275

7.3.2 vnode的操作 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.1 PC I/O体系结构 293

8.1.2 FreeBSD大容量存储I/O子系统的结构 295

8.1.3 设备命名和访问 296

8.2 从用户到设备的I/O映射 297

8.2.1 设备驱动程序 298

8.2.2 I/O队列 299

8.2.3 中断处理 299

8.3 字符设备 299

8.3.1 原始设备和物理I/O 301

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.7 GEOM层 316

8.7.1 术语和拓扑规则 317

8.7.2 改变拓扑 318

8.7.3 操作 320

8.7.4 拓扑灵活性 321

8.8 CAM层 322

8.8.1 通过CAM子系统的SCSI I/O请求的路径 323

8.8.2 ATA磁盘 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.2 Virtio 336

8.10.3 Xen 339

8.10.4 设备直通 346

习题 346

第9章 快速文件系统 348

9.1 分层文件系统管理 348

9.2 inode结构 350

9.2.1 inode格式的改变 351

9.2.2 扩展属性 352

9.2.3 新的文件系统功能 354

9.2.4 文件标志 355

9.2.5 动态inode 356

9.2.6 inode管理 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.4 inode依赖跟踪 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.16 fsck的软更新要求 389

9.7 文件系统快照 389

9.7.1 创建一个文件系统快照 389

9.7.2 维护文件系统快照 391

9.7.3 大文件系统快照 392

9.7.4 后台fsck 393

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.1 FreeBSD NFS的实现 428

11.2.2 客户端-服务器端交互 432

11.2.3 安全问题 432

11.2.4 性能提升技巧 433

11.3 NFS演进 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.1 mbuf 460

12.3.2 存储管理算法 463

12.3.3 mbuf实用例程 463

12.4 IPC数据结构 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.1 pr_output 484

12.10.2 pr_input 485

12.10.3 pr_ctlinput 485

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.1 IPv 4498

13.1.1 IPv4地址 500

13.1.2 广播地址 501

13.1.3 Internet组播 502

13.1.4 链路层地址解析 503

13.2 ICMP 504

13.3 IPv 6506

13.3.1 IPv6地址 507

13.3.2 IPv6数据包格式 509

13.3.3 切换到套接字API 510

13.3.4 自动配置 511

13.4 Internet协议代码结构 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.1 IPSec概述 530

13.7.2 安全协议 531

13.7.3 密钥管理 533

13.7.4 IPSec实现 537

13.8 数据包处理框架 539

13.8.1 伯克利数据包过滤器 539

13.8.2 IP防火墙 540

13.8.3 IPFW和Dummynet 541

13.8.4 数据包过滤器 544

13.8.5 netgraph 545

13.8.6 netmap 549

习题 551

第14章 传输层协议 553

14.1 Internet端口与关联 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.1 TCP连接状态 558

14.3.2 序列变量 561

14.4 TCP算法 562

14.4.1 定时器 563

14.4.2 往返时间的估计 565

14.4.3 建立连接 565

14.4.4 SYN缓存 567

14.4.5 SYN cookie 568

14.4.6 关闭连接 569

14.5 TCP输入处理 569

14.6 TCP输出处理 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.12 Vegas算法 584

14.6.13 Cubic算法 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

术语表

参考文献

· · · · · ·

参考文献