深入解析Windows操作系统(第6版)下册
第8章 I/O系统 1
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
查看完整
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
查看完整
Mark Russinovich(马克・拉希诺维奇)是微软windows Azure组技术人员,是Sysinternals工具的作者之一,合著了《深入解析Windows操作系统》系列图书;David A.Solomon(大卫・A.所罗门)是《深入解析Windows操作系统》系列图书的合著者,并为全球成千上万的开发人员和IT专业人士,包括微软员工,讲授Windows内幕课程。他时常在微软举办的会议中发言,包括TechNet和PDC
范德成,2004年毕业于上海交通大学,在微软和SAP公司有多年项目经验,构建了微型开源项目Robbie's Shell.潘爱民,任职于阿里巴巴,长期从事软件和系统技术的研究与开发工作,撰写了大量软件技术文章,著译了多部经典计机图书,在国内外学术刊物上发表了30多篇文章。曾经任教于北京大学和清华大学(兼职),后进入工业界,先后任职于微软亚洲研究院、盛大网络发展有限公司和阿里云计算有限公司,目前也是工信部移动操作系统专家组…
查看完整
范德成,2004年毕业于上海交通大学,在微软和SAP公司有多年项目经验,构建了微型开源项目Robbie's Shell.潘爱民,任职于阿里巴巴,长期从事软件和系统技术的研究与开发工作,撰写了大量软件技术文章,著译了多部经典计机图书,在国内外学术刊物上发表了30多篇文章。曾经任教于北京大学和清华大学(兼职),后进入工业界,先后任职于微软亚洲研究院、盛大网络发展有限公司和阿里云计算有限公司,目前也是工信部移动操作系统专家组…
查看完整
本书是Windows技术**参考书的*新版本,本书主要介绍了基于Windows 7 and Windows Server 2008 R2的核心技术与底层技术,全面阐释Windows技术机理,是广大Windows开发人员必备的参考书。
第8章 I/O系统 1
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
驱动程序对象和设备对象 13
实验:看一看设备对象 15
实验:显示驱动程序和设备对象 17
打开设备 18
实验:查看设备句柄 21
实验:查看Windows设备名称之间的映射 23
8.3 I/O处理 24
I/O类型 24
同步I/O和异步I/O 24
快速I/O 25
实验:查看一个驱动程序登记的快速I/O例程 25
映射文件I/O和文件缓存 26
分散/聚集I/O 27
I/O请求包 27
IRP栈单元 28
实验:查看驱动程序的分发例程 29
实验:查看一个线程的未完成IRP 29
IRP缓冲区管理 30
针对单层驱动程序的I/O请求 32
为一个中断提供服务 33
完成一个I/O请求 34
同步 36
针对分层的驱动程序的I/O请求 38
实验:查看一个设备栈 39
实验:查看IRP 40
线程无关I/O 45
I/O取消 45
用户发起的I/O取消 46
线程终止时的I/O取消 47
实验:调试一个无法被杀死的进程 48
I/O完成端口 49
IoCompletion对象 50
使用完成端口 50
I/O完成端口操作 52
I/O优先级支持 54
I/O优先级 54
优先化策略 55
I/O优先级反转的避免(I/O优先级继承) 57
I/O优先级提升和撞升 57
实验:“非常低”和“正常”I/O吞吐量的对比 58
实验:I/O优先级提升/撞升的性能分析 59
带宽预留(计划的文件I/O) 60
容器通知 60
驱动程序检验器(Driver Verifier) 61
8.4 内核模式驱动程序框架(KMDF) 63
KMDF驱动程序的结构和操作 64
实验:显示KMDF驱动程序 65
KMDF数据模型 66
KMDF的I/O模型 69
8.5 用户模式驱动程序框架(UMDF) 72
8.6 即插即用(PnP)管理器 76
即插即用支持的级别 77
驱动程序对于即插即用的支持 77
驱动程序加载、初始化和安装 79
Start值 80
设备列举 81
实验:将设备树转储出来 84
设备栈 85
设备栈的驱动程序加载 86
实验:在设备管理器中查看详细的devnode信息 88
驱动程序安装 90
实验:检查一个驱动程序的INF文件 92
实验:查看目录(catalog)文件 93
8.7 电源管理器 94
电源管理器的操作 96
驱动程序的电源操作 97
实验:查看一个驱动程序的电源映射关系 97
实验:查看系统的电源能力和策略 98
驱动程序和应用程序对于设备电源的控制 100
电源可用性请求 100
实验:在调试器中查看一个电源可用性请求 101
实验:利用Powercfg查看电源可用性请求 103
处理器电源管理(PPM) 103
核心停运的策略 104
利用率函数 105
实验:查看利用率和频率的信息 106
实验:查看利用率和频率的历史 107
算法覆盖 108
增加/减少动作 108
各种阈值和策略的设置 109
实验:查看当前的核心停运策略 111
“性能检查”算法 112
实验:查看当前的PPM检查信息 116
8.8 本章总结 118
第9章 存储管理 119
9.1 有关存储的术语 119
9.2 磁盘设备 120
旋转磁盘 120
磁盘的扇区格式 120
固态硬盘 122
NAND型闪存 122
文件的删除和irim命令 124
9.3 磁盘驱动程序 125
Winload 125
磁盘类、端口和小端口驱动程序 126
iSCSI驱动程序 127
多路径I/O(MPIO)驱动程序 128
实验:观察物理磁盘I/O 130
磁盘设备对象 130
分区管理器 131
9.4 卷的管理 132
基本磁盘 133
MBR风格的分区 133
GPT(GUID分区表)分区方案 133
基本磁盘卷管理器 134
动态磁盘 135
LDM数据库 135
实验:使用LDMDump来查看LDM数据库 137
LDM和GPT或MBR风格的分区方案 139
动态磁盘的卷管理器 140
多分区卷的管理 140
跨距卷 141
条带卷 142
实验:观察镜像卷的I/O操作 143
RAID-5卷 145
卷名字空间 145
挂载管理器 146
挂载点 147
卷的挂载 148
实验:查看VPB 149
卷的I/O操作 152
虚拟磁盘服务 153
9.5 虚拟硬盘(VHD文件)支持 155
附载VHD的操作 156
嵌套的文件系统 156
9.6 BitLocker驱动器加密 157
加密密钥 159
可信平台模块(TPM) 161
BitLocker引导过程 163
BitLocker密钥的恢复 165
全卷加密驱动程序 166
BitLocker的管理 167
BitLocker To Go 168
9.7 卷影像(shadow)拷贝服务 170
影像拷贝 170
“克隆”影像拷贝 170
“写时复制”影像拷贝 170
VSS的架构 170
VSS的操作 171
影像拷贝提供者 172
实验:查看Microsoft影像拷贝提供者的过滤型设备对象 173
Windows中的用途 174
备份 174
实验:查看影像卷的设备对象 174
“之前的版本”和系统还原 175
实验:导航到“之前的版本” 176
实验:映射卷影像设备对象 177
9.8 本章总结 178
第10章 内存管理 179
10.1 内存管理器简介 179
内存管理器组件 180
内部同步 181
检查内存的使用情况 182
实验:查看系统内存信息 182
10.2 内存管理器提供的服务 184
大页面和小页面 185
保留页面和提交页面 187
实验:保留的页面对比提交的页面 188
提交限额 190
锁住内存 190
分配粒度 191
共享内存和映射文件 192
实验:查看内存映射文件 193
保护内存 194
“不可执行”页面保护 196
实验:查看进程上的DEP保护 199
软件的数据执行保护 200
写时复制 201
地址窗口扩展 203
10.3 内核模式堆(系统内存池) 204
内存池的大小 205
实验:确定最大的池大小值 206
监视内存池的使用 208
实验:诊断内存池泄漏 210
快查表(Look-Aside List) 211
实验:查看系统的快查表 212
10.4 堆管理器 212
堆的类型 213
堆管理器结构 214
堆同步 215
低碎片堆 215
堆的安全特性 216
堆的调试特性 217
pageheap 218
容错堆 218
10.5 虚拟地址空间的布局结构 219
x86地址空间的布局结构 221
实验:检查一个应用程序能否感知大地址空间 222
x86系统地址空间的布局结构 223
x86会话空间 224
实验:查看会话 224
实验:查看会话空间的使用情况 225
系统页表项(PTE,Page Table Entry) 226
实验:查看会话空间的使用情况 226
64位地址空间布局结构 227
x64虚拟寻址的限制 230
Windows x64的16TB限制 231
动态的系统虚拟地址空间管理 233
实验:查询系统虚拟地址的用量 234
实验:设置系统虚拟地址的限制值 235
系统的虚拟地址空间配额 236
用户地址空间的布局结构 237
实验:对用户虚拟地址空间进行分析 238
映像随机化 239
栈的随机化 240
堆的随机化 240
内核地址空间中的ASLR 240
对安全性缓和措施的控制 240
实验:查看进程上的ASLR保护 241
10.6 地址转译 241
x86虚拟地址转译 242
页目录 245
实验:检查页目录和PDE 245
页表和页表项 246
页表项中硬件和软件的“写”位 247
页面内的字节 248
地址转译快查缓冲区 248
物理地址扩展(PAE) 249
实验:转译地址 251
x64虚拟地址转译 253
IA64虚拟地址转译 254
10.7 页面错误处理 255
无效PTE 256
原型PTE 258
页面换入I/O 259
冲突的页面错误 260
聚簇的页面错误 260
页面文件 261
实验:查看系统页面文件 262
提交用量和系统提交限额 263
提交用量和页面文件的大小 266
实验:利用任务管理器来查看页面文件使用量 266
10.8 栈 268
用户栈 268
实验:创建最大数量的线程 268
内核栈 269
实验:观察内核栈的使用量 269
DPC栈 270
10.9 虚拟地址描述符 270
进程的VAD 271
实验:查看虚拟地址描述符 272
旋转VAD 272
10.10 NUMA 273
10.11 内存区对象 274
实验:查看内存区对象 275
实验:查看控制区域 277
10.12 驱动程序检验器 280
10.13 页面帧编号数据库 284
实验:查看PFN数据库 287
页面列表的动态变化 288
实验:空闲列表和零页面列表 289
实验:已修改列表和备用列表 291
页面优先级 296
实验:观察区分优先级的备用列表 298
已修改页面写出器 299
PFN数据结构 301
实验:查看PFN项 304
10.14 物理内存的限制 305
Windows客户版本的限制 306
32位客户的有效内存限制 307
10.15 工作集 309
按需换页 309
逻辑预取器 310
实验:窥探预取文件内部 312
实验:观察预取文件的读和写 312
放置策略 313
工作集管理 314
实验:查看进程工作集大小 316
实验:工作集与虚拟大小 316
实验:在调试器中查看工作集列表 317
平衡集管理器和交换器 318
系统工作集 319
内存通知事件 320
实验:查看内存资源通知事件 321
10.16 主动式内存管理(Superfetch) 322
各个组件 322
跟踪过程和日志记录 324
场景 325
页面优先级和重平衡 326
鲁棒性能 328
RAM优化软件 329
ReadyBoost 330
ReadyDrive 331
统一缓存 332
进程反射 334
实验:利用Preflect来观察进程反射的行为 336
10.17 本章总结 337
第11章 缓存管理器 338
11.1 缓存管理器的关键特性 338
单个中心化的系统缓存 339
内存管理器 339
缓存一致性 339
虚拟块缓存 341
流式缓存机制 341
对可恢复文件系统的支持 341
11.2 缓存的虚拟内存管理 342
11.3 缓存的大小 344
缓存的虚拟大小 344
缓存的工作集大小 344
实验:查看系统缓存的工作集 345
缓存的物理大小 345
11.4 缓存的数据结构 347
系统范围的缓存数据结构 347
实验:查看系统缓存的工作集 349
针对每个文件的缓存数据结构 350
实验:查看共享的和私有的缓存表 353
11.5 文件系统接口 355
从缓存中来回拷贝数据 356
通过映射和锁定接口进行缓存 356
通过直接内存访问接口进行缓存 357
11.6 快速I/O 357
11.7 预读(Read Ahead)和滞后写(Write Behind) 359
智能预读 359
回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 361
实验:观察缓存管理器的活动情况 362
禁止一个文件的延迟写出行为 367
强迫缓存被直写(write-through)到磁盘上 367
刷新映射文件 367
实验:观察缓存的刷新 368
写节流(Write Throttling) 369
实验:查看写节流参数 370
系统线程 370
11.8 本章总结 371
第12章 文件系统 372
12.1 Windows文件系统格式 373
CDFS 373
UDF 374
FAT12、FAT16和FAT32 374
exFAT 377
NTFS 377
12.2 文件系统驱动程序总体结构 378
本地FSD 379
远程FSD 380
锁定 381
实验:查看已注册文件系统的列表 383
文件系统操作 387
显式文件I/O 388
内存管理器的修改页面写出器和映射页面写出器 392
缓存管理器的延迟写出器(Lazy Writer) 392
缓存管理器的预读线程 392
内存管理器的页面错误处理器 393
文件系统过滤型驱动程序 393
进程监视器 393
实验:查看进程监视器的过滤型驱动程序 394
12.3 诊断文件系统的问题 395
进程监视器的基本和高级模式 395
实验:在一个空闲系统上查看文件系统的活动 395
进程监视器诊断技巧 396
12.4 公用日志文件系统 397
列集操作 397
日志的类型 398
日志的布局结构 400
日志序列号 401
日志块 401
所有者页面 402
虚拟LSN到物理LSN的转译 403
管理策略 404
12.5 NTFS设计目标和特性 404
高端(High-End)文件系统的需求 404
可恢复性 405
安全性 405
数据冗余和容错能力 405
NTFS的高级特性 406
多数据流 406
实验:查看数据流 408
基于Unicode的名称 408
通用的索引设施 409
动态的坏簇重新映射 409
硬链接(link)和交接(junction) 409
实验:创建一个硬链接 410
符号(软)链接和交接(junction) 410
实验:创建一个符号链接 412
压缩文件和稀疏文件 412
变化日志 413
针对每个用户的卷配额 413
链接跟踪 414
加密 415
POSIX支持 416
碎片整理 416
动态分区 417
12.6 NTFS文件系统驱动程序 419
12.7 NTFS在磁盘上的结构 421
卷(volume) 421
簇(cluster) 422
主文件表(MFT) 423
实验:查看NTFS信息 425
文件记录号 426
文件记录 426
文件名 429
隧道传输 431
驻留的和非驻留的属性 432
数据压缩和稀疏文件 435
压缩稀疏数据 435
压缩非稀疏数据 437
稀疏文件 439
变化日志文件 439
实验:读取变化日志 441
索引 442
对象ID 444
配额跟踪 444
统一的安全性 445
重解析点 447
事务支持 447
隔离性 448
实验:理解和管理事务 449
事务型API 450
资源管理器 451
实验:查询资源管理器的信息 452
磁盘上的实现 453
日志的实现 454
恢复的实现 455
12.8 NTFS的恢复支持 455
设计 456
元数据日志记录 457
日志文件服务(LFS) 457
日志记录类型 459
恢复 461
分析扫描(Analysis Pass) 462
重做扫描(Redo Pass) 463
撤销扫描(Undo Pass) 463
NTFS的坏簇恢复 465
自我修复 468
12.9 加密文件系统(EFS)安全性 469
第一次加密一个文件 472
加密文件数据 473
解密过程 474
加密文件的备份 474
实验:查看EFS信息 475
加密文件的复制 475
12.10 本章总结 476
第13章 启动和停机 477
13.1 引导过程 477
BIOS引导准备 477
BIOS引导扇区和Bootmgr 481
UEFI引导过程 495
从iSCSI引导 496
初始化内核和执行体子系统 497
实验:加载器参数块 497
Smss、Csrss和Wininit 504
未完成的文件重命名操作 507
ReadyBoot 509
自动启动的映像文件 510
实验:Autoruns 511
13.2 引导和启动问题的故障检查 511
最后已知的好配置 512
安全模式 512
安全模式下的驱动程序加载 513
能感知安全模式的用户程序 514
安全模式下的引导日志 515
Windows恢复环境(WinRE) 516
引导状态文件 519
解决常见的引导问题 520
MBR损坏 520
引导扇区损坏 520
BCD的错误配置 520
系统文件损坏 521
Windows资源保护 522
System储巢损坏 523
启动屏幕之后的崩溃或者挂起 523
13.3 停机 525
实验:验证HungAppTimeout值 526
13.4 本章总结 528
第14章 崩溃转储分析 529
14.1 Windows为什么会崩溃 529
14.2 蓝屏 530
Windows崩溃的原因 531
14.3 诊断崩溃问题 533
14.4 崩溃转储文件 535
实验:查看转储文件的信息 539
崩溃转储的生成 540
14.5 Windows错误报告 542
14.6 在线崩溃分析 543
14.7 基本的崩溃转储分析 545
Notmyfault 545
基本的崩溃转储分析 546
详细的分析 547
14.8 使用崩溃诊断工具 549
缓冲区溢出、内存破坏和特殊内存池 550
实验:通过驱动程序检验器启用特殊内存池 552
代码改写和系统代码写保护 553
14.9 高级的崩溃转储分析 554
栈破坏 555
挂起的或无响应的系统 557
实验:利用LiveKd来生成Hyper-V客户的转储 559
当没有崩溃转储时 561
实验:附载一个内核调试器 562
14.10 对常见停止代码的分析 564
0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564
0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566
0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567
0xC5 - DRIVER_CORRUPTED_EXPOOL 569
硬件故障 571
实验:蓝屏屏幕保护程序 572
14.11 本章小结 572
译者序一
在所有介绍Windows操作系统的图书中,我相信都离不开Windows Internals系列提供的信息。除了公开可见到的Windows源代码以外,本书是披露Windows系统机理最为详尽的一份资料,尤其对于Windows的每一个最新版本。本书第6版专门针对Windows 7和Windows Server 2008 R2进行了大幅度更新。由于篇幅的增加,这一版本改成了上下两册来发行,由此也可见本书的“分量”。本书上册中文版已于2014年4月出版,这几年间,我经常收到读者的询问,本书下册是否出版。现在,下册中文版终于要出版了,读者们可以如愿看到本书了。
在Windows操作系统的发展历程中,Windows 7是一个具有特殊意义的版本。它可以算得上是最为复杂的单机操作系统,无论是从代码规模、代码复杂度,还是从系统适应场景的复杂程度,都超过了以前所有的版本。从某种意义上,Windows 7代表了软件工程的一个顶峰――人类可以构造出如此复杂且能稳定工作的软件系统!与此相对应,要用一本书来涵盖其中的各种机理也同样是一项艰巨的任务,本书作者基于他们过去所做的大量工作,以及对Windows的深入理解,出色地完成了这一诠释工作。
本书的权威性毋庸置疑。Mark Russinovich因在Windows内核探索方面所作出的贡献而成为Microsoft Fellow(现为Azure CTO),本书中用到的大量Sysinternals工具均出自他的手笔。David Solomon长期从事Windows NT内部机理的培训,他不仅在全球各地培训Windows系统程序员,甚至也为Microsoft的内部员工提供Windows内核培训服务,他从本书第2版开始奠定了卓有成效的叙述风格。Alex Ionescu是一名年轻的黑客型Windows专家,曾经为ReactOS(一个开源的操作系统项目,旨在兼容Windows 2000/XP/Server 2003的应用程序)编写了绝大多数内核代码。他曾经发现和报告了一些与Windows内核相关的软件漏洞,也跟David Solomon一起讲授Windows内部机理的课程。有如此强大的作者组合,再加上Microsoft的内部支持(包括提供源代码,以及Windows开发组的细致解释),本书无疑是Windows最新版本的第一手技术资料。
每一个对Windows操作系统有浓厚兴趣的读者都不应该错过这本书。本书上册介绍了Windows的系统架构、系统机制、管理机制、进程与线程、安全性和网络。下册是上册的直接延续,共有7章,分别介绍了Windows I/O、存储管理、内存管理、缓存管理器、文件系统、启动与停机,以及崩溃转储分析。每一章都是一个重要话题,读者既可以在上册的基础上继续深入钻研Windows各个子系统,也可以有选择地阅读某些章节。在阅读过程中,最好能动手做一做书中描述的实验。做这些实验的门槛并不高,但效果非常好,既可以让你直观地领会Windows内部的一些设计与实现,也可以积累一些洞察Windows内部活动的方法,这些方法对于排查Windows平台上出现的问题往往很有帮助。
我与本书的渊源是从第4版(针对Windows XP/Server 2003)开始的,后来第5版(针对Windows Vista/Server 2008)错过了出版周期,直至这次第6版又有机会翻译。这三个版本,连同后来的第7版(针对Windows 10/Server 2016)都采用同样的叙述框架,只是针对最新的Windows版本做了更新。本书讲述的内容,虽然是针对Windows 7/Server 2008 R2,但更新幅度较大,尤其是有关64位系统的介绍,有较多新内容。即使读者已经在Windows 8或者Windows 10上工作,本书中的内容仍然对你有价值。另外,如果读者不满足于本书Windows系统机理的系列介绍,而希望进一步理解Windows操作系统的源代码实现以及内核中的各种基础算法,则推荐阅读另一本书《Windows内核原理与实现》,这是我在Windows XP/Server 2003 SP1内核代码基础上写作的一本讲解Windows内核的书,它几乎将Windows内核大白于天下。
最后,我要特别感谢范德成先生,他在我第4版译稿的基础上,更新到了第6版。也要感谢电子工业出版社的编辑刘皎,依然把第6版的翻译工作交给了我,使我有机会弥补第5版中文版未能出版之缺憾。
潘爱民
2018年1月于杭州
译者序二
微软的Windows操作系统历经三十年左右的发展,早已成为一个博大精深的桌面及服务器操作系统,并在市场上获得了很大的成功。但近十年来,以亚马逊、谷歌、Facebook等为代表的互联网企业在市场和技术两方面开疆拓土,极大地推动了移动设备、云计算、大数据和人工智能等行业的发展,显著影响了包括微软在内的各大传统软件巨头的发展态势。继2006年亚马逊提出云计算之后,微软于2008年首度公开Azure虚拟机云平台,SAP也在2012年公开其应用程序云平台。尽管各种新的技术不断涌现,但本书的定位焦点仍然在Windows操作系统本身,在我看来,这本书的价值依然很高,因为技术的本源有共通性,Windows操作系统又可谓是微软技术的中流砥柱――微软的Azure云平台的操作系统就是基于Windows开发的,其上运行的虚拟机管理器正是最早在Windows Server 2008中发布的Hyper-V。
如果你对Windows操作系统有着浓厚的兴趣,自然不应该错过本书。如果你是分布式系统架构师,也同样能从本书中受益。这是因为,分布式系统和操作系统在许多方面都有着或多或少的相似性,对操作系统设计原理的掌握自然会对分布式系统的设计有重大启发和帮助。比如,操作系统的线程调度和分布式系统的负载均衡、操作系统的磁盘缓存和分布式系统的缓存设计、操作系统的文件系统和分布式系统的文件系统、虚拟机管理器的VLAN和分布式系统的软件定义网络(SDN)、操作系统的性能监视器与分布式系统服务器的性能监视平台等之间都有不少相似性。
以事务处理为例,Windows Vista中引入了KTM(内核事务管理器,参见本书第12章),它所实现的事务的隔离级别类似于数据库的READ COMMITTED级别,是一种几乎所有SQL数据库都会实现的隔离级别;而分布式系统中的Paxos共识算法所能实现的分布式事务,其隔离级别也类似于READ COMMITTED。又以磁盘缓存为例(参见本书第11章),操作系统的磁盘缓存是强一致性的,而分布式系统缓存可以做成应用服务器内的,或者是专门的缓存层,前一种实现对负载均衡调度有特殊要求,而普通的负载均衡会大大降低缓存命中率从而导致系统性能低下,后一种实现则在网络延迟上稍差些。两种实现都要考虑是做成强一致性的还是最终一致性的,前者需要在写的同时更新缓存,后者则需要自动淘汰旧的缓存数据。缓存的粒度也很重要,粒度过小可能导致索引数据量过大,这和操作系统磁盘缓存的原理是类似的。所以,理解操作系统的知识能拓展眼界,进而对基于这些系统的设计产生正面影响。
此外,理解操作系统的行为有助于设计性能更高的分布式程序。比如,了解操作系统磁盘缓存的原理,有助于设计出高性能的对象存储服务――可以想办法提高对象存储在操作系统上的缓存命中率,或者在必要时禁用操作系统缓存而改为自己实现缓存机制。又如,了解操作系统网络栈的工作模式,有助于编写做高速网络传输的程序,甚至可以深入驱动程序层面做进一步的性能优化。
我是Windows操作系统的深度用户,学习和研究了包括Windows、Linux、FreeBSD、OpenBSD在内的多种操作系统。从1995年首次接触Windows 3.1开始,就与Windows结下了不解之缘。陆续使用过Windows 3.1、Windows 95、Windows 98、Windows ME、Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1和Windows 10等各个版本,还接触过Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2等服务器版本,以及其上的Microsoft Virtual PC、Virtual Server和Hyper-V虚拟化技术。我会好奇它们有着怎样的功能和性能,底层是怎样工作的,为什么这样设计而不是那样设计的;正是因为这种好奇,所以Windows Internals一直是我十分感兴趣的一本书。在完成本书上册的翻译工作后,我写了一篇后记(http://www.fandecheng.com/personal/ interests/pwindows/wi_translation_ps.pdf里面讲了很多个人的理解和感悟)。2012年,当好友高博打电话告诉我有机会参与《深入解析Windows操作系统》第6版的翻译时,我非常欣喜。在高博的引荐下,我首次见到了仰慕已久的潘爱民老师。因此我非常感谢高博的引荐和潘爱民老师的认可,感谢电子工业出版社的刘皎和白涛两位编辑,本书的出版离不开他们的策划和编辑。
范德成
2018年1月于上海浦东张江
引言
《深入解析Windows操作系统(第6版)》的读者对象是那些想要理解Microsoft Windows 7和Windows Server 2008 R2操作系统的核心组件内部工作机理的高级计算机专业人员(包括开发人员和系统管理员)。开发人员利用这些知识,可以在构建Windows平台上的应用程序时更好地理解各种设计决策背后的基本原理,调试复杂的问题。系统管理员也可以从这些信息中获益,因为理解了操作系统背后的工作原理,有助于理解系统的性能行为,并且在事情变糟时更容易诊断各种系统问题。在阅读了这本书以后,你应该可以更好地理解Windows是如何工作的,以及它为什么有这样那样的表现。
本书的结构
《深入解析Windows操作系统(第6版)》第一次被分成了上下册来出版。为Windows的每一个版本更新这本书需要花相当多的时间,所以,按照上下册来组织本书内容使我们可以更快地出版上册部分。
本书上册的前两章为“概念和工具”和“系统结构”:第1章定义了关键的概念,并介绍了本书后面用到的工具;第2章讲述了总体系统结构和组件。接下来的两章展示了系统中关键的底层机制和管理机制。上册部分还覆盖了操作系统的三个核心组件:进程、线程和作业;安全性;网络。
本书下册的内容覆盖了剩余的核心子系统:I/O、存储、内存管理、缓存管理器和文件系统。下册最后部分还描述了启动和停机过程,并介绍了崩溃转储分析。
本书的历史
本书以前的名称是“Inside Windows NT”(Microsoft Press,1992,中文版的名称是《Windows NT技术内幕》),现在是第6版。第1版由Helen Custer撰写(在Microsoft Windows NT 3.1最初发布之前出版)。Inside Windows NT是第一本关于Windows NT的书籍,它提供了有关Windows NT系统架构和设计方面的关键要点。Inside Windows NT (Second Edition)(Microsoft Press, 1998)由David Solomon撰写,在内容上做了更新,涵盖了Windows NT 4.0,并且大大地提高了技术深度的层次。
“Inside Windows 2000 (Third Edition)”(Microsoft Press,2000)由David Solomon和Mark Russinovich合著完成。第3版增加了许多新的话题,比如启动和停机、Windows服务的内部机理、注册表的内部机理、文件系统驱动程序、网络。它也覆盖了Windows 2000中内核的变化,比如Windows驱动程序模型(WDM,Windows Driver Model)、即插即用、电源管理、Windows管理设施(WMI,Windows Management Instrumentation)、加密、作业对象和终端服务。Windows Internals (Fourth Edition)是针对Windows XP和Windows Server 2003的更新,它加入了更多的内容,主要集中在帮助IT专业人员更好地利用Windows的内部机理的知识,比如使用Windows Sysinternals (www.microsoft.com/technet/sysinternals)的关键工具,以及分析崩溃转储。Windows Internals (Fifth Edition)是针对Windows Vista和Windows Server 2008的更新,它包含的新内容有:映像加载器、用户模式调试设施,以及Hyper-V。
第6版的变化
这一最新的版本在内容上做了更新,以覆盖Windows 7和Windows Server 2008 R2中所做的内核变化。练习用的实验也相应地做了更新,以反映出工具中的变化。
练习实验
即使没有访问Windows源代码,你也可以通过一些工具(比如内核调试器,以及来自Sysinternals和Winsider Seminars & Solutions的工具)获得许多有关Windows内部机理的知识。当可以通过一个工具来揭示或演示Windows内部行为的某一方面时,本书的“实验”辅助章节就会列出让你自己试用该工具时遵从的步骤。这样的实验遍布全书,我们鼓励你在阅读本书时试一试这些实验――看一看Windows内部是如何工作的,这比你仅仅读一遍本书印象要深刻得多。
本书没有覆盖的话题
Windows是一个大而复杂的操作系统。本书并没有覆盖与Windows内部机理相关的一切内容,而是把焦点集中在基本的系统组件上。例如,本书没有讲述COM+(Windows分布式面向对象编程基础设施),也没有讲述Microsoft .NET框架(托管代码应用程序的基础)。
因为这是一本讲述内部机理的书籍,不是一本用户指南、程序设计或系统管理类型的书籍,所以,本书没有描述如何使用、编程或配置Windows。
提醒和告诫
因为本书讲述的是Windows操作系统中未文档化的内部结构和内部操作的行为(比如内核结构和函数),所以,这些内容有可能会在不同发行版本之间有所变化。(外部的接口,比如Windows API,则不会受到不兼容变化的影响。)
说到“受版本变化的影响”,我们并不是指本书所讲述的细节将在不同发行版本之间一定有所变化,但是你不能认为它们不会改变。任何使用了这些未文档化接口的软件都有可能在将来的Windows版本上无法正常工作。更糟的是,在内核模式下运行并且用到了这些未文档化接口的软件(比如设备驱动程序)在新的Windows发行版本上运行时可能会导致系统崩溃。
致谢
首先,感谢Azius LLC的Jamie Hanrahan和BrianCatlin加入这一项目――没有他们的帮助,本书将无法完成。他们对“安全性”和“网络”这两章做了大量的更新,也为“管理机制”和“进程和线程”这两章的更新做出了很多贡献。Azius提供了Windows内部机理和设备驱动程序的训练。更多信息参见www.azius.com。
我们想要感谢Alex Ionescu,在这一版本中他是一名完全的联合作者。这包含了Alex在本书第5版所做的大量工作,以及在这一版本中持续做的工作。
同时感谢Daniel Pearson,他更新了“崩溃转储分析”一章。他多年来的转储分析经验,使得本章内容更加贴近真实场景。
感谢Eric Traut和Jon DeVaan,继续让David Solomon可以为了写作本书而访问Windows源代码,以及继续开发他的Windows Internals课程。
有三个关键的评审者尚未因为他们对第5版的评审和贡献而被致以感谢,他们是:Arun Kishan、Landy Wang和Aaron Margosis。再次感谢他们!再次感谢Arun和Landy为这一版本所做的详细审查和极有帮助的见地。
若没有来自Microsoft Windows开发组关键成员的审查、建议和支持,这本书不会拥有现在这样的技术细节深度和精确度。因此,我们感谢下面的人员,他们为本书提供了技术审查和建议:Greg Cottingham、Joe Hamburg、Jeff Lambert、Pavel Lebedinsky、Joseph East、Adi Oltean、Alexey Pakhunov、Valerie See。
同时感谢Scott Lee、Tim Shoultz和Eric Kratzer在编写“崩溃转储分析”这章时所提供的协助。
对于“网络”这一章,特别感谢Gianluigi Nusca和Tom Jolly,他们所做的远远超出了他们的责任范围:Gianluigi在BranchCache的材料方面提供了特别有用的帮助,以及大量的建议(他还写了许多段落材料);Tom Jolly不仅提供了优秀的审查意见和建议,而且让许多其他的开发人员帮忙做技术审查。下面是所有对“网络”这一章做了审查和贡献的人员:Roopesh Battepati、Molly Brown、Greg Cottingham、Dotan Elharrar、Eric Hanson、Tom Jolly、Manoj Kadam、Greg Kramer、David Kruse、Jeff Lambert、Darene Lewis、Dan Lovinger、Gianluigi Nusca、Amos Ortal、Ivan Pashov、Ganesh Prasad、Paul Swan、Shiva Kumar Thangapandi。
Amos Ortal和Dotan Elharrar对NAP的内容提供了帮助,Shiva Kumar Thangapandi对EAP部分提供了大量帮助。
感谢Gerard Murphy为本书审阅Windows 7停机机制的内容,并清楚地解释了不同组策略下的行为。
感谢Microsoft电源管理组的Tristan Brown,有好几天他在办公室陪Alex一起加班到深夜,仔细解释处理器核心的停运算法和行为。他还提供了一幅珍贵的插图。
感谢Apurva Doshi给Alex发了一份详细解释了缓存管理器在Windows 7中改变的文档,本书中所介绍的一些新的行为和改变正是由于该文档的帮助才研究清楚的。
感谢Matthieu Suiche,是他提供的内核符号文件数据库让Alex能发现最核心的内核数据结构中新增和去除的字段,并由此引发了他对底层功能变化的探索和发现。
感谢Cenk Ergan、Michael Fortin和Mehmet Iyigun对Superfetch细节部分的审查和建议。
Christophe Nasarre作为总体技术评审人,他所做的详细检查极大地提高了本书的技术精确度和一致性。
我们也要再次感谢Hex-Rays(www.hex-rays.com)的Ilfak Guilfanov,因为他们为Alex Ionescu提供了IDA Pro Advanced and Hex Rays许可,所以Alex可以加快对Windows内核的逆向工程。
最后,作者们要感谢Microsoft Press的同事们,他们在背后做了很多工作,将这本书变成现实。Devon Musgrave作为本书的策划编辑,承担了双重职责:既要考虑成本,也要考虑本书的发展;Carol Dillingham是本书的项目编辑。编辑和产品经理Steve Sagman、版权编辑Roger LeBanc、校对编辑Audrey Marr和索引编辑Christina Yeager都为本书的质量做出了贡献。
最后,感谢Microsoft Press的发行人Ben Ryan,他始终相信为读者提供如此详细程度的Windows知识是极其重要的!
勘误和本书支持
我们做了各种努力来确保本书的精确性。自本书出版以来已经报告的任何错误都将在http://go.microsoft.com/FWLink/?Linkid=245675上列出。
如果你遇到了尚未列出的错误,你可以通过以上页面将错误报告给我们。
如果你需要额外的支持,请发送电子邮件给Microsoft Press Book Support:mspinput@microsoft.com。
请注意,通过上述地址并不会提供有关Microsoft软件产品的支持。
倾听你的声音
让你满意是我们最高优先级的工作,你的反馈也是我们最有价值的财富。
注册博文视点社区(www.broadview.com.cn)用户,即享受以下服务:
? 提勘误赚积分:可在【提交勘误】处提交对内容的修改意见,若被采纳将获赠博文视点社区积分(可用来抵扣购买电子书的相应金额)。
? 交流学习:在页面下方【读者评论】处留下您的疑问或观点,与作译者和其他读者共同交流。
页面入口:http://www.broadview.com.cn/33643。
保持联系
让我们保持热线联系,我们在Twitter上的地址是:http://twitter.com/MicrosoftPress。
Contents
目录
第8章 I/O系统 1
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
驱动程序对象和设备对象 13
实验:看一看设备对象 15
实验:显示驱动程序和设备对象 17
打开设备 18
实验:查看设备句柄 21
实验:查看Windows设备名称之间的映射 23
8.3 I/O处理 24
I/O类型 24
同步I/O和异步I/O 24
快速I/O 25
实验:查看一个驱动程序登记的快速I/O例程 25
映射文件I/O和文件缓存 26
分散/聚集I/O 27
I/O请求包 27
IRP栈单元 28
实验:查看驱动程序的分发例程 29
实验:查看一个线程的未完成IRP 29
IRP缓冲区管理 30
针对单层驱动程序的I/O请求 32
为一个中断提供服务 33
完成一个I/O请求 34
同步 36
针对分层的驱动程序的I/O请求 38
实验:查看一个设备栈 39
实验:查看IRP 40
线程无关I/O 45
I/O取消 45
用户发起的I/O取消 46
线程终止时的I/O取消 47
实验:调试一个无法被杀死的进程 48
I/O完成端口 49
IoCompletion对象 50
使用完成端口 50
I/O完成端口操作 52
I/O优先级支持 54
I/O优先级 54
优先化策略 55
I/O优先级反转的避免(I/O优先级继承) 57
I/O优先级提升和撞升 57
实验:“非常低”和“正常”I/O吞吐量的对比 58
实验:I/O优先级提升/撞升的性能分析 59
带宽预留(计划的文件I/O) 60
容器通知 60
驱动程序检验器(Driver Verifier) 61
8.4 内核模式驱动程序框架(KMDF) 63
KMDF驱动程序的结构和操作 64
实验:显示KMDF驱动程序 65
KMDF数据模型 66
KMDF的I/O模型 69
8.5 用户模式驱动程序框架(UMDF) 72
8.6 即插即用(PnP)管理器 76
即插即用支持的级别 77
驱动程序对于即插即用的支持 77
驱动程序加载、初始化和安装 79
Start值 80
设备列举 81
实验:将设备树转储出来 84
设备栈 85
设备栈的驱动程序加载 86
实验:在设备管理器中查看详细的devnode信息 88
驱动程序安装 90
实验:检查一个驱动程序的INF文件 92
实验:查看目录(catalog)文件 93
8.7 电源管理器 94
电源管理器的操作 96
驱动程序的电源操作 97
实验:查看一个驱动程序的电源映射关系 97
实验:查看系统的电源能力和策略 98
驱动程序和应用程序对于设备电源的控制 100
电源可用性请求 100
实验:在调试器中查看一个电源可用性请求 101
实验:利用Powercfg查看电源可用性请求 103
处理器电源管理(PPM) 103
核心停运的策略 104
利用率函数 105
实验:查看利用率和频率的信息 106
实验:查看利用率和频率的历史 107
算法覆盖 108
增加/减少动作 108
各种阈值和策略的设置 109
实验:查看当前的核心停运策略 111
“性能检查”算法 112
实验:查看当前的PPM检查信息 116
8.8 本章总结 118
第9章 存储管理 119
9.1 有关存储的术语 119
9.2 磁盘设备 120
旋转磁盘 120
磁盘的扇区格式 120
固态硬盘 122
NAND型闪存 122
文件的删除和irim命令 124
9.3 磁盘驱动程序 125
Winload 125
磁盘类、端口和小端口驱动程序 126
iSCSI驱动程序 127
多路径I/O(MPIO)驱动程序 128
实验:观察物理磁盘I/O 130
磁盘设备对象 130
分区管理器 131
9.4 卷的管理 132
基本磁盘 133
MBR风格的分区 133
GPT(GUID分区表)分区方案 133
基本磁盘卷管理器 134
动态磁盘 135
LDM数据库 135
实验:使用LDMDump来查看LDM数据库 137
LDM和GPT或MBR风格的分区方案 139
动态磁盘的卷管理器 140
多分区卷的管理 140
跨距卷 141
条带卷 142
实验:观察镜像卷的I/O操作 143
RAID-5卷 145
卷名字空间 145
挂载管理器 146
挂载点 147
卷的挂载 148
实验:查看VPB 149
卷的I/O操作 152
虚拟磁盘服务 153
9.5 虚拟硬盘(VHD文件)支持 155
附载VHD的操作 156
嵌套的文件系统 156
9.6 BitLocker驱动器加密 157
加密密钥 159
可信平台模块(TPM) 161
BitLocker引导过程 163
BitLocker密钥的恢复 165
全卷加密驱动程序 166
BitLocker的管理 167
BitLocker To Go 168
9.7 卷影像(shadow)拷贝服务 170
影像拷贝 170
“克隆”影像拷贝 170
“写时复制”影像拷贝 170
VSS的架构 170
VSS的操作 171
影像拷贝提供者 172
实验:查看Microsoft影像拷贝提供者的过滤型设备对象 173
Windows中的用途 174
备份 174
实验:查看影像卷的设备对象 174
“之前的版本”和系统还原 175
实验:导航到“之前的版本” 176
实验:映射卷影像设备对象 177
9.8 本章总结 178
第10章 内存管理 179
10.1 内存管理器简介 179
内存管理器组件 180
内部同步 181
检查内存的使用情况 182
实验:查看系统内存信息 182
10.2 内存管理器提供的服务 184
大页面和小页面 185
保留页面和提交页面 187
实验:保留的页面对比提交的页面 188
提交限额 190
锁住内存 190
分配粒度 191
共享内存和映射文件 192
实验:查看内存映射文件 193
保护内存 194
“不可执行”页面保护 196
实验:查看进程上的DEP保护 199
软件的数据执行保护 200
写时复制 201
地址窗口扩展 203
10.3 内核模式堆(系统内存池) 204
内存池的大小 205
实验:确定最大的池大小值 206
监视内存池的使用 208
实验:诊断内存池泄漏 210
快查表(Look-Aside List) 211
实验:查看系统的快查表 212
10.4 堆管理器 212
堆的类型 213
堆管理器结构 214
堆同步 215
低碎片堆 215
堆的安全特性 216
堆的调试特性 217
pageheap 218
容错堆 218
10.5 虚拟地址空间的布局结构 219
x86地址空间的布局结构 221
实验:检查一个应用程序能否感知大地址空间 222
x86系统地址空间的布局结构 223
x86会话空间 224
实验:查看会话 224
实验:查看会话空间的使用情况 225
系统页表项(PTE,Page Table Entry) 226
实验:查看会话空间的使用情况 226
64位地址空间布局结构 227
x64虚拟寻址的限制 230
Windows x64的16TB限制 231
动态的系统虚拟地址空间管理 233
实验:查询系统虚拟地址的用量 234
实验:设置系统虚拟地址的限制值 235
系统的虚拟地址空间配额 236
用户地址空间的布局结构 237
实验:对用户虚拟地址空间进行分析 238
映像随机化 239
栈的随机化 240
堆的随机化 240
内核地址空间中的ASLR 240
对安全性缓和措施的控制 240
实验:查看进程上的ASLR保护 241
10.6 地址转译 241
x86虚拟地址转译 242
页目录 245
实验:检查页目录和PDE 245
页表和页表项 246
页表项中硬件和软件的“写”位 247
页面内的字节 248
地址转译快查缓冲区 248
物理地址扩展(PAE) 249
实验:转译地址 251
x64虚拟地址转译 253
IA64虚拟地址转译 254
10.7 页面错误处理 255
无效PTE 256
原型PTE 258
页面换入I/O 259
冲突的页面错误 260
聚簇的页面错误 260
页面文件 261
实验:查看系统页面文件 262
提交用量和系统提交限额 263
提交用量和页面文件的大小 266
实验:利用任务管理器来查看页面文件使用量 266
10.8 栈 268
用户栈 268
实验:创建最大数量的线程 268
内核栈 269
实验:观察内核栈的使用量 269
DPC栈 270
10.9 虚拟地址描述符 270
进程的VAD 271
实验:查看虚拟地址描述符 272
旋转VAD 272
10.10 NUMA 273
10.11 内存区对象 274
实验:查看内存区对象 275
实验:查看控制区域 277
10.12 驱动程序检验器 280
10.13 页面帧编号数据库 284
实验:查看PFN数据库 287
页面列表的动态变化 288
实验:空闲列表和零页面列表 289
实验:已修改列表和备用列表 291
页面优先级 296
实验:观察区分优先级的备用列表 298
已修改页面写出器 299
PFN数据结构 301
实验:查看PFN项 304
10.14 物理内存的限制 305
Windows客户版本的限制 306
32位客户的有效内存限制 307
10.15 工作集 309
按需换页 309
逻辑预取器 310
实验:窥探预取文件内部 312
实验:观察预取文件的读和写 312
放置策略 313
工作集管理 314
实验:查看进程工作集大小 316
实验:工作集与虚拟大小 316
实验:在调试器中查看工作集列表 317
平衡集管理器和交换器 318
系统工作集 319
内存通知事件 320
实验:查看内存资源通知事件 321
10.16 主动式内存管理(Superfetch) 322
各个组件 322
跟踪过程和日志记录 324
场景 325
页面优先级和重平衡 326
鲁棒性能 328
RAM优化软件 329
ReadyBoost 330
ReadyDrive 331
统一缓存 332
进程反射 334
实验:利用Preflect来观察进程反射的行为 336
10.17 本章总结 337
第11章 缓存管理器 338
11.1 缓存管理器的关键特性 338
单个中心化的系统缓存 339
内存管理器 339
缓存一致性 339
虚拟块缓存 341
流式缓存机制 341
对可恢复文件系统的支持 341
11.2 缓存的虚拟内存管理 342
11.3 缓存的大小 344
缓存的虚拟大小 344
缓存的工作集大小 344
实验:查看系统缓存的工作集 345
缓存的物理大小 345
11.4 缓存的数据结构 347
系统范围的缓存数据结构 347
实验:查看系统缓存的工作集 349
针对每个文件的缓存数据结构 350
实验:查看共享的和私有的缓存表 353
11.5 文件系统接口 355
从缓存中来回拷贝数据 356
通过映射和锁定接口进行缓存 356
通过直接内存访问接口进行缓存 357
11.6 快速I/O 357
11.7 预读(Read Ahead)和滞后写(Write Behind) 359
智能预读 359
回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 361
实验:观察缓存管理器的活动情况 362
禁止一个文件的延迟写出行为 367
强迫缓存被直写(write-through)到磁盘上 367
刷新映射文件 367
实验:观察缓存的刷新 368
写节流(Write Throttling) 369
实验:查看写节流参数 370
系统线程 370
11.8 本章总结 371
第12章 文件系统 372
12.1 Windows文件系统格式 373
CDFS 373
UDF 374
FAT12、FAT16和FAT32 374
exFAT 377
NTFS 377
12.2 文件系统驱动程序总体结构 378
本地FSD 379
远程FSD 380
锁定 381
实验:查看已注册文件系统的列表 383
文件系统操作 387
显式文件I/O 388
内存管理器的修改页面写出器和映射页面写出器 392
缓存管理器的延迟写出器(Lazy Writer) 392
缓存管理器的预读线程 392
内存管理器的页面错误处理器 393
文件系统过滤型驱动程序 393
进程监视器 393
实验:查看进程监视器的过滤型驱动程序 394
12.3 诊断文件系统的问题 395
进程监视器的基本和高级模式 395
实验:在一个空闲系统上查看文件系统的活动 395
进程监视器诊断技巧 396
12.4 公用日志文件系统 397
列集操作 397
日志的类型 398
日志的布局结构 400
日志序列号 401
日志块 401
所有者页面 402
虚拟LSN到物理LSN的转译 403
管理策略 404
12.5 NTFS设计目标和特性 404
高端(High-End)文件系统的需求 404
可恢复性 405
安全性 405
数据冗余和容错能力 405
NTFS的高级特性 406
多数据流 406
实验:查看数据流 408
基于Unicode的名称 408
通用的索引设施 409
动态的坏簇重新映射 409
硬链接(link)和交接(junction) 409
实验:创建一个硬链接 410
符号(软)链接和交接(junction) 410
实验:创建一个符号链接 412
压缩文件和稀疏文件 412
变化日志 413
针对每个用户的卷配额 413
链接跟踪 414
加密 415
POSIX支持 416
碎片整理 416
动态分区 417
12.6 NTFS文件系统驱动程序 419
12.7 NTFS在磁盘上的结构 421
卷(volume) 421
簇(cluster) 422
主文件表(MFT) 423
实验:查看NTFS信息 425
文件记录号 426
文件记录 426
文件名 429
隧道传输 431
驻留的和非驻留的属性 432
数据压缩和稀疏文件 435
压缩稀疏数据 435
压缩非稀疏数据 437
稀疏文件 439
变化日志文件 439
实验:读取变化日志 441
索引 442
对象ID 444
配额跟踪 444
统一的安全性 445
重解析点 447
事务支持 447
隔离性 448
实验:理解和管理事务 449
事务型API 450
资源管理器 451
实验:查询资源管理器的信息 452
磁盘上的实现 453
日志的实现 454
恢复的实现 455
12.8 NTFS的恢复支持 455
设计 456
元数据日志记录 457
日志文件服务(LFS) 457
日志记录类型 459
恢复 461
分析扫描(Analysis Pass) 462
重做扫描(Redo Pass) 463
撤销扫描(Undo Pass) 463
NTFS的坏簇恢复 465
自我修复 468
12.9 加密文件系统(EFS)安全性 469
第一次加密一个文件 472
加密文件数据 473
解密过程 474
加密文件的备份 474
实验:查看EFS信息 475
加密文件的复制 475
12.10 本章总结 476
第13章 启动和停机 477
13.1 引导过程 477
BIOS引导准备 477
BIOS引导扇区和Bootmgr 481
UEFI引导过程 495
从iSCSI引导 496
初始化内核和执行体子系统 497
实验:加载器参数块 497
Smss、Csrss和Wininit 504
未完成的文件重命名操作 507
ReadyBoot 509
自动启动的映像文件 510
实验:Autoruns 511
13.2 引导和启动问题的故障检查 511
最后已知的好配置 512
安全模式 512
安全模式下的驱动程序加载 513
能感知安全模式的用户程序 514
安全模式下的引导日志 515
Windows恢复环境(WinRE) 516
引导状态文件 519
解决常见的引导问题 520
MBR损坏 520
引导扇区损坏 520
BCD的错误配置 520
系统文件损坏 521
Windows资源保护 522
System储巢损坏 523
启动屏幕之后的崩溃或者挂起 523
13.3 停机 525
实验:验证HungAppTimeout值 526
13.4 本章总结 528
第14章 崩溃转储分析 529
14.1 Windows为什么会崩溃 529
14.2 蓝屏 530
Windows崩溃的原因 531
14.3 诊断崩溃问题 533
14.4 崩溃转储文件 535
实验:查看转储文件的信息 539
崩溃转储的生成 540
14.5 Windows错误报告 542
14.6 在线崩溃分析 543
14.7 基本的崩溃转储分析 545
Notmyfault 545
基本的崩溃转储分析 546
详细的分析 547
14.8 使用崩溃诊断工具 549
缓冲区溢出、内存破坏和特殊内存池 550
实验:通过驱动程序检验器启用特殊内存池 552
代码改写和系统代码写保护 553
14.9 高级的崩溃转储分析 554
栈破坏 555
挂起的或无响应的系统 557
实验:利用LiveKd来生成Hyper-V客户的转储 559
当没有崩溃转储时 561
实验:附载一个内核调试器 562
14.10 对常见停止代码的分析 564
0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564
0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566
0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567
0xC5 - DRIVER_CORRUPTED_EXPOOL 569
硬件故障 571
实验:蓝屏屏幕保护程序 572
14.11 本章小结 572
^ 收 起
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
驱动程序对象和设备对象 13
实验:看一看设备对象 15
实验:显示驱动程序和设备对象 17
打开设备 18
实验:查看设备句柄 21
实验:查看Windows设备名称之间的映射 23
8.3 I/O处理 24
I/O类型 24
同步I/O和异步I/O 24
快速I/O 25
实验:查看一个驱动程序登记的快速I/O例程 25
映射文件I/O和文件缓存 26
分散/聚集I/O 27
I/O请求包 27
IRP栈单元 28
实验:查看驱动程序的分发例程 29
实验:查看一个线程的未完成IRP 29
IRP缓冲区管理 30
针对单层驱动程序的I/O请求 32
为一个中断提供服务 33
完成一个I/O请求 34
同步 36
针对分层的驱动程序的I/O请求 38
实验:查看一个设备栈 39
实验:查看IRP 40
线程无关I/O 45
I/O取消 45
用户发起的I/O取消 46
线程终止时的I/O取消 47
实验:调试一个无法被杀死的进程 48
I/O完成端口 49
IoCompletion对象 50
使用完成端口 50
I/O完成端口操作 52
I/O优先级支持 54
I/O优先级 54
优先化策略 55
I/O优先级反转的避免(I/O优先级继承) 57
I/O优先级提升和撞升 57
实验:“非常低”和“正常”I/O吞吐量的对比 58
实验:I/O优先级提升/撞升的性能分析 59
带宽预留(计划的文件I/O) 60
容器通知 60
驱动程序检验器(Driver Verifier) 61
8.4 内核模式驱动程序框架(KMDF) 63
KMDF驱动程序的结构和操作 64
实验:显示KMDF驱动程序 65
KMDF数据模型 66
KMDF的I/O模型 69
8.5 用户模式驱动程序框架(UMDF) 72
8.6 即插即用(PnP)管理器 76
即插即用支持的级别 77
驱动程序对于即插即用的支持 77
驱动程序加载、初始化和安装 79
Start值 80
设备列举 81
实验:将设备树转储出来 84
设备栈 85
设备栈的驱动程序加载 86
实验:在设备管理器中查看详细的devnode信息 88
驱动程序安装 90
实验:检查一个驱动程序的INF文件 92
实验:查看目录(catalog)文件 93
8.7 电源管理器 94
电源管理器的操作 96
驱动程序的电源操作 97
实验:查看一个驱动程序的电源映射关系 97
实验:查看系统的电源能力和策略 98
驱动程序和应用程序对于设备电源的控制 100
电源可用性请求 100
实验:在调试器中查看一个电源可用性请求 101
实验:利用Powercfg查看电源可用性请求 103
处理器电源管理(PPM) 103
核心停运的策略 104
利用率函数 105
实验:查看利用率和频率的信息 106
实验:查看利用率和频率的历史 107
算法覆盖 108
增加/减少动作 108
各种阈值和策略的设置 109
实验:查看当前的核心停运策略 111
“性能检查”算法 112
实验:查看当前的PPM检查信息 116
8.8 本章总结 118
第9章 存储管理 119
9.1 有关存储的术语 119
9.2 磁盘设备 120
旋转磁盘 120
磁盘的扇区格式 120
固态硬盘 122
NAND型闪存 122
文件的删除和irim命令 124
9.3 磁盘驱动程序 125
Winload 125
磁盘类、端口和小端口驱动程序 126
iSCSI驱动程序 127
多路径I/O(MPIO)驱动程序 128
实验:观察物理磁盘I/O 130
磁盘设备对象 130
分区管理器 131
9.4 卷的管理 132
基本磁盘 133
MBR风格的分区 133
GPT(GUID分区表)分区方案 133
基本磁盘卷管理器 134
动态磁盘 135
LDM数据库 135
实验:使用LDMDump来查看LDM数据库 137
LDM和GPT或MBR风格的分区方案 139
动态磁盘的卷管理器 140
多分区卷的管理 140
跨距卷 141
条带卷 142
实验:观察镜像卷的I/O操作 143
RAID-5卷 145
卷名字空间 145
挂载管理器 146
挂载点 147
卷的挂载 148
实验:查看VPB 149
卷的I/O操作 152
虚拟磁盘服务 153
9.5 虚拟硬盘(VHD文件)支持 155
附载VHD的操作 156
嵌套的文件系统 156
9.6 BitLocker驱动器加密 157
加密密钥 159
可信平台模块(TPM) 161
BitLocker引导过程 163
BitLocker密钥的恢复 165
全卷加密驱动程序 166
BitLocker的管理 167
BitLocker To Go 168
9.7 卷影像(shadow)拷贝服务 170
影像拷贝 170
“克隆”影像拷贝 170
“写时复制”影像拷贝 170
VSS的架构 170
VSS的操作 171
影像拷贝提供者 172
实验:查看Microsoft影像拷贝提供者的过滤型设备对象 173
Windows中的用途 174
备份 174
实验:查看影像卷的设备对象 174
“之前的版本”和系统还原 175
实验:导航到“之前的版本” 176
实验:映射卷影像设备对象 177
9.8 本章总结 178
第10章 内存管理 179
10.1 内存管理器简介 179
内存管理器组件 180
内部同步 181
检查内存的使用情况 182
实验:查看系统内存信息 182
10.2 内存管理器提供的服务 184
大页面和小页面 185
保留页面和提交页面 187
实验:保留的页面对比提交的页面 188
提交限额 190
锁住内存 190
分配粒度 191
共享内存和映射文件 192
实验:查看内存映射文件 193
保护内存 194
“不可执行”页面保护 196
实验:查看进程上的DEP保护 199
软件的数据执行保护 200
写时复制 201
地址窗口扩展 203
10.3 内核模式堆(系统内存池) 204
内存池的大小 205
实验:确定最大的池大小值 206
监视内存池的使用 208
实验:诊断内存池泄漏 210
快查表(Look-Aside List) 211
实验:查看系统的快查表 212
10.4 堆管理器 212
堆的类型 213
堆管理器结构 214
堆同步 215
低碎片堆 215
堆的安全特性 216
堆的调试特性 217
pageheap 218
容错堆 218
10.5 虚拟地址空间的布局结构 219
x86地址空间的布局结构 221
实验:检查一个应用程序能否感知大地址空间 222
x86系统地址空间的布局结构 223
x86会话空间 224
实验:查看会话 224
实验:查看会话空间的使用情况 225
系统页表项(PTE,Page Table Entry) 226
实验:查看会话空间的使用情况 226
64位地址空间布局结构 227
x64虚拟寻址的限制 230
Windows x64的16TB限制 231
动态的系统虚拟地址空间管理 233
实验:查询系统虚拟地址的用量 234
实验:设置系统虚拟地址的限制值 235
系统的虚拟地址空间配额 236
用户地址空间的布局结构 237
实验:对用户虚拟地址空间进行分析 238
映像随机化 239
栈的随机化 240
堆的随机化 240
内核地址空间中的ASLR 240
对安全性缓和措施的控制 240
实验:查看进程上的ASLR保护 241
10.6 地址转译 241
x86虚拟地址转译 242
页目录 245
实验:检查页目录和PDE 245
页表和页表项 246
页表项中硬件和软件的“写”位 247
页面内的字节 248
地址转译快查缓冲区 248
物理地址扩展(PAE) 249
实验:转译地址 251
x64虚拟地址转译 253
IA64虚拟地址转译 254
10.7 页面错误处理 255
无效PTE 256
原型PTE 258
页面换入I/O 259
冲突的页面错误 260
聚簇的页面错误 260
页面文件 261
实验:查看系统页面文件 262
提交用量和系统提交限额 263
提交用量和页面文件的大小 266
实验:利用任务管理器来查看页面文件使用量 266
10.8 栈 268
用户栈 268
实验:创建最大数量的线程 268
内核栈 269
实验:观察内核栈的使用量 269
DPC栈 270
10.9 虚拟地址描述符 270
进程的VAD 271
实验:查看虚拟地址描述符 272
旋转VAD 272
10.10 NUMA 273
10.11 内存区对象 274
实验:查看内存区对象 275
实验:查看控制区域 277
10.12 驱动程序检验器 280
10.13 页面帧编号数据库 284
实验:查看PFN数据库 287
页面列表的动态变化 288
实验:空闲列表和零页面列表 289
实验:已修改列表和备用列表 291
页面优先级 296
实验:观察区分优先级的备用列表 298
已修改页面写出器 299
PFN数据结构 301
实验:查看PFN项 304
10.14 物理内存的限制 305
Windows客户版本的限制 306
32位客户的有效内存限制 307
10.15 工作集 309
按需换页 309
逻辑预取器 310
实验:窥探预取文件内部 312
实验:观察预取文件的读和写 312
放置策略 313
工作集管理 314
实验:查看进程工作集大小 316
实验:工作集与虚拟大小 316
实验:在调试器中查看工作集列表 317
平衡集管理器和交换器 318
系统工作集 319
内存通知事件 320
实验:查看内存资源通知事件 321
10.16 主动式内存管理(Superfetch) 322
各个组件 322
跟踪过程和日志记录 324
场景 325
页面优先级和重平衡 326
鲁棒性能 328
RAM优化软件 329
ReadyBoost 330
ReadyDrive 331
统一缓存 332
进程反射 334
实验:利用Preflect来观察进程反射的行为 336
10.17 本章总结 337
第11章 缓存管理器 338
11.1 缓存管理器的关键特性 338
单个中心化的系统缓存 339
内存管理器 339
缓存一致性 339
虚拟块缓存 341
流式缓存机制 341
对可恢复文件系统的支持 341
11.2 缓存的虚拟内存管理 342
11.3 缓存的大小 344
缓存的虚拟大小 344
缓存的工作集大小 344
实验:查看系统缓存的工作集 345
缓存的物理大小 345
11.4 缓存的数据结构 347
系统范围的缓存数据结构 347
实验:查看系统缓存的工作集 349
针对每个文件的缓存数据结构 350
实验:查看共享的和私有的缓存表 353
11.5 文件系统接口 355
从缓存中来回拷贝数据 356
通过映射和锁定接口进行缓存 356
通过直接内存访问接口进行缓存 357
11.6 快速I/O 357
11.7 预读(Read Ahead)和滞后写(Write Behind) 359
智能预读 359
回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 361
实验:观察缓存管理器的活动情况 362
禁止一个文件的延迟写出行为 367
强迫缓存被直写(write-through)到磁盘上 367
刷新映射文件 367
实验:观察缓存的刷新 368
写节流(Write Throttling) 369
实验:查看写节流参数 370
系统线程 370
11.8 本章总结 371
第12章 文件系统 372
12.1 Windows文件系统格式 373
CDFS 373
UDF 374
FAT12、FAT16和FAT32 374
exFAT 377
NTFS 377
12.2 文件系统驱动程序总体结构 378
本地FSD 379
远程FSD 380
锁定 381
实验:查看已注册文件系统的列表 383
文件系统操作 387
显式文件I/O 388
内存管理器的修改页面写出器和映射页面写出器 392
缓存管理器的延迟写出器(Lazy Writer) 392
缓存管理器的预读线程 392
内存管理器的页面错误处理器 393
文件系统过滤型驱动程序 393
进程监视器 393
实验:查看进程监视器的过滤型驱动程序 394
12.3 诊断文件系统的问题 395
进程监视器的基本和高级模式 395
实验:在一个空闲系统上查看文件系统的活动 395
进程监视器诊断技巧 396
12.4 公用日志文件系统 397
列集操作 397
日志的类型 398
日志的布局结构 400
日志序列号 401
日志块 401
所有者页面 402
虚拟LSN到物理LSN的转译 403
管理策略 404
12.5 NTFS设计目标和特性 404
高端(High-End)文件系统的需求 404
可恢复性 405
安全性 405
数据冗余和容错能力 405
NTFS的高级特性 406
多数据流 406
实验:查看数据流 408
基于Unicode的名称 408
通用的索引设施 409
动态的坏簇重新映射 409
硬链接(link)和交接(junction) 409
实验:创建一个硬链接 410
符号(软)链接和交接(junction) 410
实验:创建一个符号链接 412
压缩文件和稀疏文件 412
变化日志 413
针对每个用户的卷配额 413
链接跟踪 414
加密 415
POSIX支持 416
碎片整理 416
动态分区 417
12.6 NTFS文件系统驱动程序 419
12.7 NTFS在磁盘上的结构 421
卷(volume) 421
簇(cluster) 422
主文件表(MFT) 423
实验:查看NTFS信息 425
文件记录号 426
文件记录 426
文件名 429
隧道传输 431
驻留的和非驻留的属性 432
数据压缩和稀疏文件 435
压缩稀疏数据 435
压缩非稀疏数据 437
稀疏文件 439
变化日志文件 439
实验:读取变化日志 441
索引 442
对象ID 444
配额跟踪 444
统一的安全性 445
重解析点 447
事务支持 447
隔离性 448
实验:理解和管理事务 449
事务型API 450
资源管理器 451
实验:查询资源管理器的信息 452
磁盘上的实现 453
日志的实现 454
恢复的实现 455
12.8 NTFS的恢复支持 455
设计 456
元数据日志记录 457
日志文件服务(LFS) 457
日志记录类型 459
恢复 461
分析扫描(Analysis Pass) 462
重做扫描(Redo Pass) 463
撤销扫描(Undo Pass) 463
NTFS的坏簇恢复 465
自我修复 468
12.9 加密文件系统(EFS)安全性 469
第一次加密一个文件 472
加密文件数据 473
解密过程 474
加密文件的备份 474
实验:查看EFS信息 475
加密文件的复制 475
12.10 本章总结 476
第13章 启动和停机 477
13.1 引导过程 477
BIOS引导准备 477
BIOS引导扇区和Bootmgr 481
UEFI引导过程 495
从iSCSI引导 496
初始化内核和执行体子系统 497
实验:加载器参数块 497
Smss、Csrss和Wininit 504
未完成的文件重命名操作 507
ReadyBoot 509
自动启动的映像文件 510
实验:Autoruns 511
13.2 引导和启动问题的故障检查 511
最后已知的好配置 512
安全模式 512
安全模式下的驱动程序加载 513
能感知安全模式的用户程序 514
安全模式下的引导日志 515
Windows恢复环境(WinRE) 516
引导状态文件 519
解决常见的引导问题 520
MBR损坏 520
引导扇区损坏 520
BCD的错误配置 520
系统文件损坏 521
Windows资源保护 522
System储巢损坏 523
启动屏幕之后的崩溃或者挂起 523
13.3 停机 525
实验:验证HungAppTimeout值 526
13.4 本章总结 528
第14章 崩溃转储分析 529
14.1 Windows为什么会崩溃 529
14.2 蓝屏 530
Windows崩溃的原因 531
14.3 诊断崩溃问题 533
14.4 崩溃转储文件 535
实验:查看转储文件的信息 539
崩溃转储的生成 540
14.5 Windows错误报告 542
14.6 在线崩溃分析 543
14.7 基本的崩溃转储分析 545
Notmyfault 545
基本的崩溃转储分析 546
详细的分析 547
14.8 使用崩溃诊断工具 549
缓冲区溢出、内存破坏和特殊内存池 550
实验:通过驱动程序检验器启用特殊内存池 552
代码改写和系统代码写保护 553
14.9 高级的崩溃转储分析 554
栈破坏 555
挂起的或无响应的系统 557
实验:利用LiveKd来生成Hyper-V客户的转储 559
当没有崩溃转储时 561
实验:附载一个内核调试器 562
14.10 对常见停止代码的分析 564
0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564
0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566
0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567
0xC5 - DRIVER_CORRUPTED_EXPOOL 569
硬件故障 571
实验:蓝屏屏幕保护程序 572
14.11 本章小结 572
译者序一
在所有介绍Windows操作系统的图书中,我相信都离不开Windows Internals系列提供的信息。除了公开可见到的Windows源代码以外,本书是披露Windows系统机理最为详尽的一份资料,尤其对于Windows的每一个最新版本。本书第6版专门针对Windows 7和Windows Server 2008 R2进行了大幅度更新。由于篇幅的增加,这一版本改成了上下两册来发行,由此也可见本书的“分量”。本书上册中文版已于2014年4月出版,这几年间,我经常收到读者的询问,本书下册是否出版。现在,下册中文版终于要出版了,读者们可以如愿看到本书了。
在Windows操作系统的发展历程中,Windows 7是一个具有特殊意义的版本。它可以算得上是最为复杂的单机操作系统,无论是从代码规模、代码复杂度,还是从系统适应场景的复杂程度,都超过了以前所有的版本。从某种意义上,Windows 7代表了软件工程的一个顶峰――人类可以构造出如此复杂且能稳定工作的软件系统!与此相对应,要用一本书来涵盖其中的各种机理也同样是一项艰巨的任务,本书作者基于他们过去所做的大量工作,以及对Windows的深入理解,出色地完成了这一诠释工作。
本书的权威性毋庸置疑。Mark Russinovich因在Windows内核探索方面所作出的贡献而成为Microsoft Fellow(现为Azure CTO),本书中用到的大量Sysinternals工具均出自他的手笔。David Solomon长期从事Windows NT内部机理的培训,他不仅在全球各地培训Windows系统程序员,甚至也为Microsoft的内部员工提供Windows内核培训服务,他从本书第2版开始奠定了卓有成效的叙述风格。Alex Ionescu是一名年轻的黑客型Windows专家,曾经为ReactOS(一个开源的操作系统项目,旨在兼容Windows 2000/XP/Server 2003的应用程序)编写了绝大多数内核代码。他曾经发现和报告了一些与Windows内核相关的软件漏洞,也跟David Solomon一起讲授Windows内部机理的课程。有如此强大的作者组合,再加上Microsoft的内部支持(包括提供源代码,以及Windows开发组的细致解释),本书无疑是Windows最新版本的第一手技术资料。
每一个对Windows操作系统有浓厚兴趣的读者都不应该错过这本书。本书上册介绍了Windows的系统架构、系统机制、管理机制、进程与线程、安全性和网络。下册是上册的直接延续,共有7章,分别介绍了Windows I/O、存储管理、内存管理、缓存管理器、文件系统、启动与停机,以及崩溃转储分析。每一章都是一个重要话题,读者既可以在上册的基础上继续深入钻研Windows各个子系统,也可以有选择地阅读某些章节。在阅读过程中,最好能动手做一做书中描述的实验。做这些实验的门槛并不高,但效果非常好,既可以让你直观地领会Windows内部的一些设计与实现,也可以积累一些洞察Windows内部活动的方法,这些方法对于排查Windows平台上出现的问题往往很有帮助。
我与本书的渊源是从第4版(针对Windows XP/Server 2003)开始的,后来第5版(针对Windows Vista/Server 2008)错过了出版周期,直至这次第6版又有机会翻译。这三个版本,连同后来的第7版(针对Windows 10/Server 2016)都采用同样的叙述框架,只是针对最新的Windows版本做了更新。本书讲述的内容,虽然是针对Windows 7/Server 2008 R2,但更新幅度较大,尤其是有关64位系统的介绍,有较多新内容。即使读者已经在Windows 8或者Windows 10上工作,本书中的内容仍然对你有价值。另外,如果读者不满足于本书Windows系统机理的系列介绍,而希望进一步理解Windows操作系统的源代码实现以及内核中的各种基础算法,则推荐阅读另一本书《Windows内核原理与实现》,这是我在Windows XP/Server 2003 SP1内核代码基础上写作的一本讲解Windows内核的书,它几乎将Windows内核大白于天下。
最后,我要特别感谢范德成先生,他在我第4版译稿的基础上,更新到了第6版。也要感谢电子工业出版社的编辑刘皎,依然把第6版的翻译工作交给了我,使我有机会弥补第5版中文版未能出版之缺憾。
潘爱民
2018年1月于杭州
译者序二
微软的Windows操作系统历经三十年左右的发展,早已成为一个博大精深的桌面及服务器操作系统,并在市场上获得了很大的成功。但近十年来,以亚马逊、谷歌、Facebook等为代表的互联网企业在市场和技术两方面开疆拓土,极大地推动了移动设备、云计算、大数据和人工智能等行业的发展,显著影响了包括微软在内的各大传统软件巨头的发展态势。继2006年亚马逊提出云计算之后,微软于2008年首度公开Azure虚拟机云平台,SAP也在2012年公开其应用程序云平台。尽管各种新的技术不断涌现,但本书的定位焦点仍然在Windows操作系统本身,在我看来,这本书的价值依然很高,因为技术的本源有共通性,Windows操作系统又可谓是微软技术的中流砥柱――微软的Azure云平台的操作系统就是基于Windows开发的,其上运行的虚拟机管理器正是最早在Windows Server 2008中发布的Hyper-V。
如果你对Windows操作系统有着浓厚的兴趣,自然不应该错过本书。如果你是分布式系统架构师,也同样能从本书中受益。这是因为,分布式系统和操作系统在许多方面都有着或多或少的相似性,对操作系统设计原理的掌握自然会对分布式系统的设计有重大启发和帮助。比如,操作系统的线程调度和分布式系统的负载均衡、操作系统的磁盘缓存和分布式系统的缓存设计、操作系统的文件系统和分布式系统的文件系统、虚拟机管理器的VLAN和分布式系统的软件定义网络(SDN)、操作系统的性能监视器与分布式系统服务器的性能监视平台等之间都有不少相似性。
以事务处理为例,Windows Vista中引入了KTM(内核事务管理器,参见本书第12章),它所实现的事务的隔离级别类似于数据库的READ COMMITTED级别,是一种几乎所有SQL数据库都会实现的隔离级别;而分布式系统中的Paxos共识算法所能实现的分布式事务,其隔离级别也类似于READ COMMITTED。又以磁盘缓存为例(参见本书第11章),操作系统的磁盘缓存是强一致性的,而分布式系统缓存可以做成应用服务器内的,或者是专门的缓存层,前一种实现对负载均衡调度有特殊要求,而普通的负载均衡会大大降低缓存命中率从而导致系统性能低下,后一种实现则在网络延迟上稍差些。两种实现都要考虑是做成强一致性的还是最终一致性的,前者需要在写的同时更新缓存,后者则需要自动淘汰旧的缓存数据。缓存的粒度也很重要,粒度过小可能导致索引数据量过大,这和操作系统磁盘缓存的原理是类似的。所以,理解操作系统的知识能拓展眼界,进而对基于这些系统的设计产生正面影响。
此外,理解操作系统的行为有助于设计性能更高的分布式程序。比如,了解操作系统磁盘缓存的原理,有助于设计出高性能的对象存储服务――可以想办法提高对象存储在操作系统上的缓存命中率,或者在必要时禁用操作系统缓存而改为自己实现缓存机制。又如,了解操作系统网络栈的工作模式,有助于编写做高速网络传输的程序,甚至可以深入驱动程序层面做进一步的性能优化。
我是Windows操作系统的深度用户,学习和研究了包括Windows、Linux、FreeBSD、OpenBSD在内的多种操作系统。从1995年首次接触Windows 3.1开始,就与Windows结下了不解之缘。陆续使用过Windows 3.1、Windows 95、Windows 98、Windows ME、Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1和Windows 10等各个版本,还接触过Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2等服务器版本,以及其上的Microsoft Virtual PC、Virtual Server和Hyper-V虚拟化技术。我会好奇它们有着怎样的功能和性能,底层是怎样工作的,为什么这样设计而不是那样设计的;正是因为这种好奇,所以Windows Internals一直是我十分感兴趣的一本书。在完成本书上册的翻译工作后,我写了一篇后记(http://www.fandecheng.com/personal/ interests/pwindows/wi_translation_ps.pdf里面讲了很多个人的理解和感悟)。2012年,当好友高博打电话告诉我有机会参与《深入解析Windows操作系统》第6版的翻译时,我非常欣喜。在高博的引荐下,我首次见到了仰慕已久的潘爱民老师。因此我非常感谢高博的引荐和潘爱民老师的认可,感谢电子工业出版社的刘皎和白涛两位编辑,本书的出版离不开他们的策划和编辑。
范德成
2018年1月于上海浦东张江
引言
《深入解析Windows操作系统(第6版)》的读者对象是那些想要理解Microsoft Windows 7和Windows Server 2008 R2操作系统的核心组件内部工作机理的高级计算机专业人员(包括开发人员和系统管理员)。开发人员利用这些知识,可以在构建Windows平台上的应用程序时更好地理解各种设计决策背后的基本原理,调试复杂的问题。系统管理员也可以从这些信息中获益,因为理解了操作系统背后的工作原理,有助于理解系统的性能行为,并且在事情变糟时更容易诊断各种系统问题。在阅读了这本书以后,你应该可以更好地理解Windows是如何工作的,以及它为什么有这样那样的表现。
本书的结构
《深入解析Windows操作系统(第6版)》第一次被分成了上下册来出版。为Windows的每一个版本更新这本书需要花相当多的时间,所以,按照上下册来组织本书内容使我们可以更快地出版上册部分。
本书上册的前两章为“概念和工具”和“系统结构”:第1章定义了关键的概念,并介绍了本书后面用到的工具;第2章讲述了总体系统结构和组件。接下来的两章展示了系统中关键的底层机制和管理机制。上册部分还覆盖了操作系统的三个核心组件:进程、线程和作业;安全性;网络。
本书下册的内容覆盖了剩余的核心子系统:I/O、存储、内存管理、缓存管理器和文件系统。下册最后部分还描述了启动和停机过程,并介绍了崩溃转储分析。
本书的历史
本书以前的名称是“Inside Windows NT”(Microsoft Press,1992,中文版的名称是《Windows NT技术内幕》),现在是第6版。第1版由Helen Custer撰写(在Microsoft Windows NT 3.1最初发布之前出版)。Inside Windows NT是第一本关于Windows NT的书籍,它提供了有关Windows NT系统架构和设计方面的关键要点。Inside Windows NT (Second Edition)(Microsoft Press, 1998)由David Solomon撰写,在内容上做了更新,涵盖了Windows NT 4.0,并且大大地提高了技术深度的层次。
“Inside Windows 2000 (Third Edition)”(Microsoft Press,2000)由David Solomon和Mark Russinovich合著完成。第3版增加了许多新的话题,比如启动和停机、Windows服务的内部机理、注册表的内部机理、文件系统驱动程序、网络。它也覆盖了Windows 2000中内核的变化,比如Windows驱动程序模型(WDM,Windows Driver Model)、即插即用、电源管理、Windows管理设施(WMI,Windows Management Instrumentation)、加密、作业对象和终端服务。Windows Internals (Fourth Edition)是针对Windows XP和Windows Server 2003的更新,它加入了更多的内容,主要集中在帮助IT专业人员更好地利用Windows的内部机理的知识,比如使用Windows Sysinternals (www.microsoft.com/technet/sysinternals)的关键工具,以及分析崩溃转储。Windows Internals (Fifth Edition)是针对Windows Vista和Windows Server 2008的更新,它包含的新内容有:映像加载器、用户模式调试设施,以及Hyper-V。
第6版的变化
这一最新的版本在内容上做了更新,以覆盖Windows 7和Windows Server 2008 R2中所做的内核变化。练习用的实验也相应地做了更新,以反映出工具中的变化。
练习实验
即使没有访问Windows源代码,你也可以通过一些工具(比如内核调试器,以及来自Sysinternals和Winsider Seminars & Solutions的工具)获得许多有关Windows内部机理的知识。当可以通过一个工具来揭示或演示Windows内部行为的某一方面时,本书的“实验”辅助章节就会列出让你自己试用该工具时遵从的步骤。这样的实验遍布全书,我们鼓励你在阅读本书时试一试这些实验――看一看Windows内部是如何工作的,这比你仅仅读一遍本书印象要深刻得多。
本书没有覆盖的话题
Windows是一个大而复杂的操作系统。本书并没有覆盖与Windows内部机理相关的一切内容,而是把焦点集中在基本的系统组件上。例如,本书没有讲述COM+(Windows分布式面向对象编程基础设施),也没有讲述Microsoft .NET框架(托管代码应用程序的基础)。
因为这是一本讲述内部机理的书籍,不是一本用户指南、程序设计或系统管理类型的书籍,所以,本书没有描述如何使用、编程或配置Windows。
提醒和告诫
因为本书讲述的是Windows操作系统中未文档化的内部结构和内部操作的行为(比如内核结构和函数),所以,这些内容有可能会在不同发行版本之间有所变化。(外部的接口,比如Windows API,则不会受到不兼容变化的影响。)
说到“受版本变化的影响”,我们并不是指本书所讲述的细节将在不同发行版本之间一定有所变化,但是你不能认为它们不会改变。任何使用了这些未文档化接口的软件都有可能在将来的Windows版本上无法正常工作。更糟的是,在内核模式下运行并且用到了这些未文档化接口的软件(比如设备驱动程序)在新的Windows发行版本上运行时可能会导致系统崩溃。
致谢
首先,感谢Azius LLC的Jamie Hanrahan和BrianCatlin加入这一项目――没有他们的帮助,本书将无法完成。他们对“安全性”和“网络”这两章做了大量的更新,也为“管理机制”和“进程和线程”这两章的更新做出了很多贡献。Azius提供了Windows内部机理和设备驱动程序的训练。更多信息参见www.azius.com。
我们想要感谢Alex Ionescu,在这一版本中他是一名完全的联合作者。这包含了Alex在本书第5版所做的大量工作,以及在这一版本中持续做的工作。
同时感谢Daniel Pearson,他更新了“崩溃转储分析”一章。他多年来的转储分析经验,使得本章内容更加贴近真实场景。
感谢Eric Traut和Jon DeVaan,继续让David Solomon可以为了写作本书而访问Windows源代码,以及继续开发他的Windows Internals课程。
有三个关键的评审者尚未因为他们对第5版的评审和贡献而被致以感谢,他们是:Arun Kishan、Landy Wang和Aaron Margosis。再次感谢他们!再次感谢Arun和Landy为这一版本所做的详细审查和极有帮助的见地。
若没有来自Microsoft Windows开发组关键成员的审查、建议和支持,这本书不会拥有现在这样的技术细节深度和精确度。因此,我们感谢下面的人员,他们为本书提供了技术审查和建议:Greg Cottingham、Joe Hamburg、Jeff Lambert、Pavel Lebedinsky、Joseph East、Adi Oltean、Alexey Pakhunov、Valerie See。
同时感谢Scott Lee、Tim Shoultz和Eric Kratzer在编写“崩溃转储分析”这章时所提供的协助。
对于“网络”这一章,特别感谢Gianluigi Nusca和Tom Jolly,他们所做的远远超出了他们的责任范围:Gianluigi在BranchCache的材料方面提供了特别有用的帮助,以及大量的建议(他还写了许多段落材料);Tom Jolly不仅提供了优秀的审查意见和建议,而且让许多其他的开发人员帮忙做技术审查。下面是所有对“网络”这一章做了审查和贡献的人员:Roopesh Battepati、Molly Brown、Greg Cottingham、Dotan Elharrar、Eric Hanson、Tom Jolly、Manoj Kadam、Greg Kramer、David Kruse、Jeff Lambert、Darene Lewis、Dan Lovinger、Gianluigi Nusca、Amos Ortal、Ivan Pashov、Ganesh Prasad、Paul Swan、Shiva Kumar Thangapandi。
Amos Ortal和Dotan Elharrar对NAP的内容提供了帮助,Shiva Kumar Thangapandi对EAP部分提供了大量帮助。
感谢Gerard Murphy为本书审阅Windows 7停机机制的内容,并清楚地解释了不同组策略下的行为。
感谢Microsoft电源管理组的Tristan Brown,有好几天他在办公室陪Alex一起加班到深夜,仔细解释处理器核心的停运算法和行为。他还提供了一幅珍贵的插图。
感谢Apurva Doshi给Alex发了一份详细解释了缓存管理器在Windows 7中改变的文档,本书中所介绍的一些新的行为和改变正是由于该文档的帮助才研究清楚的。
感谢Matthieu Suiche,是他提供的内核符号文件数据库让Alex能发现最核心的内核数据结构中新增和去除的字段,并由此引发了他对底层功能变化的探索和发现。
感谢Cenk Ergan、Michael Fortin和Mehmet Iyigun对Superfetch细节部分的审查和建议。
Christophe Nasarre作为总体技术评审人,他所做的详细检查极大地提高了本书的技术精确度和一致性。
我们也要再次感谢Hex-Rays(www.hex-rays.com)的Ilfak Guilfanov,因为他们为Alex Ionescu提供了IDA Pro Advanced and Hex Rays许可,所以Alex可以加快对Windows内核的逆向工程。
最后,作者们要感谢Microsoft Press的同事们,他们在背后做了很多工作,将这本书变成现实。Devon Musgrave作为本书的策划编辑,承担了双重职责:既要考虑成本,也要考虑本书的发展;Carol Dillingham是本书的项目编辑。编辑和产品经理Steve Sagman、版权编辑Roger LeBanc、校对编辑Audrey Marr和索引编辑Christina Yeager都为本书的质量做出了贡献。
最后,感谢Microsoft Press的发行人Ben Ryan,他始终相信为读者提供如此详细程度的Windows知识是极其重要的!
勘误和本书支持
我们做了各种努力来确保本书的精确性。自本书出版以来已经报告的任何错误都将在http://go.microsoft.com/FWLink/?Linkid=245675上列出。
如果你遇到了尚未列出的错误,你可以通过以上页面将错误报告给我们。
如果你需要额外的支持,请发送电子邮件给Microsoft Press Book Support:mspinput@microsoft.com。
请注意,通过上述地址并不会提供有关Microsoft软件产品的支持。
倾听你的声音
让你满意是我们最高优先级的工作,你的反馈也是我们最有价值的财富。
注册博文视点社区(www.broadview.com.cn)用户,即享受以下服务:
? 提勘误赚积分:可在【提交勘误】处提交对内容的修改意见,若被采纳将获赠博文视点社区积分(可用来抵扣购买电子书的相应金额)。
? 交流学习:在页面下方【读者评论】处留下您的疑问或观点,与作译者和其他读者共同交流。
页面入口:http://www.broadview.com.cn/33643。
保持联系
让我们保持热线联系,我们在Twitter上的地址是:http://twitter.com/MicrosoftPress。
Contents
目录
第8章 I/O系统 1
8.1 I/O系统组件 1
I/O管理器 3
典型的I/O处理过程 4
8.2 设备驱动程序 5
设备驱动程序的类型 5
WDM驱动程序 6
分层的驱动程序 7
实验:查看已加载的驱动程序列表 9
驱动程序的结构 11
驱动程序对象和设备对象 13
实验:看一看设备对象 15
实验:显示驱动程序和设备对象 17
打开设备 18
实验:查看设备句柄 21
实验:查看Windows设备名称之间的映射 23
8.3 I/O处理 24
I/O类型 24
同步I/O和异步I/O 24
快速I/O 25
实验:查看一个驱动程序登记的快速I/O例程 25
映射文件I/O和文件缓存 26
分散/聚集I/O 27
I/O请求包 27
IRP栈单元 28
实验:查看驱动程序的分发例程 29
实验:查看一个线程的未完成IRP 29
IRP缓冲区管理 30
针对单层驱动程序的I/O请求 32
为一个中断提供服务 33
完成一个I/O请求 34
同步 36
针对分层的驱动程序的I/O请求 38
实验:查看一个设备栈 39
实验:查看IRP 40
线程无关I/O 45
I/O取消 45
用户发起的I/O取消 46
线程终止时的I/O取消 47
实验:调试一个无法被杀死的进程 48
I/O完成端口 49
IoCompletion对象 50
使用完成端口 50
I/O完成端口操作 52
I/O优先级支持 54
I/O优先级 54
优先化策略 55
I/O优先级反转的避免(I/O优先级继承) 57
I/O优先级提升和撞升 57
实验:“非常低”和“正常”I/O吞吐量的对比 58
实验:I/O优先级提升/撞升的性能分析 59
带宽预留(计划的文件I/O) 60
容器通知 60
驱动程序检验器(Driver Verifier) 61
8.4 内核模式驱动程序框架(KMDF) 63
KMDF驱动程序的结构和操作 64
实验:显示KMDF驱动程序 65
KMDF数据模型 66
KMDF的I/O模型 69
8.5 用户模式驱动程序框架(UMDF) 72
8.6 即插即用(PnP)管理器 76
即插即用支持的级别 77
驱动程序对于即插即用的支持 77
驱动程序加载、初始化和安装 79
Start值 80
设备列举 81
实验:将设备树转储出来 84
设备栈 85
设备栈的驱动程序加载 86
实验:在设备管理器中查看详细的devnode信息 88
驱动程序安装 90
实验:检查一个驱动程序的INF文件 92
实验:查看目录(catalog)文件 93
8.7 电源管理器 94
电源管理器的操作 96
驱动程序的电源操作 97
实验:查看一个驱动程序的电源映射关系 97
实验:查看系统的电源能力和策略 98
驱动程序和应用程序对于设备电源的控制 100
电源可用性请求 100
实验:在调试器中查看一个电源可用性请求 101
实验:利用Powercfg查看电源可用性请求 103
处理器电源管理(PPM) 103
核心停运的策略 104
利用率函数 105
实验:查看利用率和频率的信息 106
实验:查看利用率和频率的历史 107
算法覆盖 108
增加/减少动作 108
各种阈值和策略的设置 109
实验:查看当前的核心停运策略 111
“性能检查”算法 112
实验:查看当前的PPM检查信息 116
8.8 本章总结 118
第9章 存储管理 119
9.1 有关存储的术语 119
9.2 磁盘设备 120
旋转磁盘 120
磁盘的扇区格式 120
固态硬盘 122
NAND型闪存 122
文件的删除和irim命令 124
9.3 磁盘驱动程序 125
Winload 125
磁盘类、端口和小端口驱动程序 126
iSCSI驱动程序 127
多路径I/O(MPIO)驱动程序 128
实验:观察物理磁盘I/O 130
磁盘设备对象 130
分区管理器 131
9.4 卷的管理 132
基本磁盘 133
MBR风格的分区 133
GPT(GUID分区表)分区方案 133
基本磁盘卷管理器 134
动态磁盘 135
LDM数据库 135
实验:使用LDMDump来查看LDM数据库 137
LDM和GPT或MBR风格的分区方案 139
动态磁盘的卷管理器 140
多分区卷的管理 140
跨距卷 141
条带卷 142
实验:观察镜像卷的I/O操作 143
RAID-5卷 145
卷名字空间 145
挂载管理器 146
挂载点 147
卷的挂载 148
实验:查看VPB 149
卷的I/O操作 152
虚拟磁盘服务 153
9.5 虚拟硬盘(VHD文件)支持 155
附载VHD的操作 156
嵌套的文件系统 156
9.6 BitLocker驱动器加密 157
加密密钥 159
可信平台模块(TPM) 161
BitLocker引导过程 163
BitLocker密钥的恢复 165
全卷加密驱动程序 166
BitLocker的管理 167
BitLocker To Go 168
9.7 卷影像(shadow)拷贝服务 170
影像拷贝 170
“克隆”影像拷贝 170
“写时复制”影像拷贝 170
VSS的架构 170
VSS的操作 171
影像拷贝提供者 172
实验:查看Microsoft影像拷贝提供者的过滤型设备对象 173
Windows中的用途 174
备份 174
实验:查看影像卷的设备对象 174
“之前的版本”和系统还原 175
实验:导航到“之前的版本” 176
实验:映射卷影像设备对象 177
9.8 本章总结 178
第10章 内存管理 179
10.1 内存管理器简介 179
内存管理器组件 180
内部同步 181
检查内存的使用情况 182
实验:查看系统内存信息 182
10.2 内存管理器提供的服务 184
大页面和小页面 185
保留页面和提交页面 187
实验:保留的页面对比提交的页面 188
提交限额 190
锁住内存 190
分配粒度 191
共享内存和映射文件 192
实验:查看内存映射文件 193
保护内存 194
“不可执行”页面保护 196
实验:查看进程上的DEP保护 199
软件的数据执行保护 200
写时复制 201
地址窗口扩展 203
10.3 内核模式堆(系统内存池) 204
内存池的大小 205
实验:确定最大的池大小值 206
监视内存池的使用 208
实验:诊断内存池泄漏 210
快查表(Look-Aside List) 211
实验:查看系统的快查表 212
10.4 堆管理器 212
堆的类型 213
堆管理器结构 214
堆同步 215
低碎片堆 215
堆的安全特性 216
堆的调试特性 217
pageheap 218
容错堆 218
10.5 虚拟地址空间的布局结构 219
x86地址空间的布局结构 221
实验:检查一个应用程序能否感知大地址空间 222
x86系统地址空间的布局结构 223
x86会话空间 224
实验:查看会话 224
实验:查看会话空间的使用情况 225
系统页表项(PTE,Page Table Entry) 226
实验:查看会话空间的使用情况 226
64位地址空间布局结构 227
x64虚拟寻址的限制 230
Windows x64的16TB限制 231
动态的系统虚拟地址空间管理 233
实验:查询系统虚拟地址的用量 234
实验:设置系统虚拟地址的限制值 235
系统的虚拟地址空间配额 236
用户地址空间的布局结构 237
实验:对用户虚拟地址空间进行分析 238
映像随机化 239
栈的随机化 240
堆的随机化 240
内核地址空间中的ASLR 240
对安全性缓和措施的控制 240
实验:查看进程上的ASLR保护 241
10.6 地址转译 241
x86虚拟地址转译 242
页目录 245
实验:检查页目录和PDE 245
页表和页表项 246
页表项中硬件和软件的“写”位 247
页面内的字节 248
地址转译快查缓冲区 248
物理地址扩展(PAE) 249
实验:转译地址 251
x64虚拟地址转译 253
IA64虚拟地址转译 254
10.7 页面错误处理 255
无效PTE 256
原型PTE 258
页面换入I/O 259
冲突的页面错误 260
聚簇的页面错误 260
页面文件 261
实验:查看系统页面文件 262
提交用量和系统提交限额 263
提交用量和页面文件的大小 266
实验:利用任务管理器来查看页面文件使用量 266
10.8 栈 268
用户栈 268
实验:创建最大数量的线程 268
内核栈 269
实验:观察内核栈的使用量 269
DPC栈 270
10.9 虚拟地址描述符 270
进程的VAD 271
实验:查看虚拟地址描述符 272
旋转VAD 272
10.10 NUMA 273
10.11 内存区对象 274
实验:查看内存区对象 275
实验:查看控制区域 277
10.12 驱动程序检验器 280
10.13 页面帧编号数据库 284
实验:查看PFN数据库 287
页面列表的动态变化 288
实验:空闲列表和零页面列表 289
实验:已修改列表和备用列表 291
页面优先级 296
实验:观察区分优先级的备用列表 298
已修改页面写出器 299
PFN数据结构 301
实验:查看PFN项 304
10.14 物理内存的限制 305
Windows客户版本的限制 306
32位客户的有效内存限制 307
10.15 工作集 309
按需换页 309
逻辑预取器 310
实验:窥探预取文件内部 312
实验:观察预取文件的读和写 312
放置策略 313
工作集管理 314
实验:查看进程工作集大小 316
实验:工作集与虚拟大小 316
实验:在调试器中查看工作集列表 317
平衡集管理器和交换器 318
系统工作集 319
内存通知事件 320
实验:查看内存资源通知事件 321
10.16 主动式内存管理(Superfetch) 322
各个组件 322
跟踪过程和日志记录 324
场景 325
页面优先级和重平衡 326
鲁棒性能 328
RAM优化软件 329
ReadyBoost 330
ReadyDrive 331
统一缓存 332
进程反射 334
实验:利用Preflect来观察进程反射的行为 336
10.17 本章总结 337
第11章 缓存管理器 338
11.1 缓存管理器的关键特性 338
单个中心化的系统缓存 339
内存管理器 339
缓存一致性 339
虚拟块缓存 341
流式缓存机制 341
对可恢复文件系统的支持 341
11.2 缓存的虚拟内存管理 342
11.3 缓存的大小 344
缓存的虚拟大小 344
缓存的工作集大小 344
实验:查看系统缓存的工作集 345
缓存的物理大小 345
11.4 缓存的数据结构 347
系统范围的缓存数据结构 347
实验:查看系统缓存的工作集 349
针对每个文件的缓存数据结构 350
实验:查看共享的和私有的缓存表 353
11.5 文件系统接口 355
从缓存中来回拷贝数据 356
通过映射和锁定接口进行缓存 356
通过直接内存访问接口进行缓存 357
11.6 快速I/O 357
11.7 预读(Read Ahead)和滞后写(Write Behind) 359
智能预读 359
回写缓存(Write-Back Caching)和延迟写(Lazy Writing) 361
实验:观察缓存管理器的活动情况 362
禁止一个文件的延迟写出行为 367
强迫缓存被直写(write-through)到磁盘上 367
刷新映射文件 367
实验:观察缓存的刷新 368
写节流(Write Throttling) 369
实验:查看写节流参数 370
系统线程 370
11.8 本章总结 371
第12章 文件系统 372
12.1 Windows文件系统格式 373
CDFS 373
UDF 374
FAT12、FAT16和FAT32 374
exFAT 377
NTFS 377
12.2 文件系统驱动程序总体结构 378
本地FSD 379
远程FSD 380
锁定 381
实验:查看已注册文件系统的列表 383
文件系统操作 387
显式文件I/O 388
内存管理器的修改页面写出器和映射页面写出器 392
缓存管理器的延迟写出器(Lazy Writer) 392
缓存管理器的预读线程 392
内存管理器的页面错误处理器 393
文件系统过滤型驱动程序 393
进程监视器 393
实验:查看进程监视器的过滤型驱动程序 394
12.3 诊断文件系统的问题 395
进程监视器的基本和高级模式 395
实验:在一个空闲系统上查看文件系统的活动 395
进程监视器诊断技巧 396
12.4 公用日志文件系统 397
列集操作 397
日志的类型 398
日志的布局结构 400
日志序列号 401
日志块 401
所有者页面 402
虚拟LSN到物理LSN的转译 403
管理策略 404
12.5 NTFS设计目标和特性 404
高端(High-End)文件系统的需求 404
可恢复性 405
安全性 405
数据冗余和容错能力 405
NTFS的高级特性 406
多数据流 406
实验:查看数据流 408
基于Unicode的名称 408
通用的索引设施 409
动态的坏簇重新映射 409
硬链接(link)和交接(junction) 409
实验:创建一个硬链接 410
符号(软)链接和交接(junction) 410
实验:创建一个符号链接 412
压缩文件和稀疏文件 412
变化日志 413
针对每个用户的卷配额 413
链接跟踪 414
加密 415
POSIX支持 416
碎片整理 416
动态分区 417
12.6 NTFS文件系统驱动程序 419
12.7 NTFS在磁盘上的结构 421
卷(volume) 421
簇(cluster) 422
主文件表(MFT) 423
实验:查看NTFS信息 425
文件记录号 426
文件记录 426
文件名 429
隧道传输 431
驻留的和非驻留的属性 432
数据压缩和稀疏文件 435
压缩稀疏数据 435
压缩非稀疏数据 437
稀疏文件 439
变化日志文件 439
实验:读取变化日志 441
索引 442
对象ID 444
配额跟踪 444
统一的安全性 445
重解析点 447
事务支持 447
隔离性 448
实验:理解和管理事务 449
事务型API 450
资源管理器 451
实验:查询资源管理器的信息 452
磁盘上的实现 453
日志的实现 454
恢复的实现 455
12.8 NTFS的恢复支持 455
设计 456
元数据日志记录 457
日志文件服务(LFS) 457
日志记录类型 459
恢复 461
分析扫描(Analysis Pass) 462
重做扫描(Redo Pass) 463
撤销扫描(Undo Pass) 463
NTFS的坏簇恢复 465
自我修复 468
12.9 加密文件系统(EFS)安全性 469
第一次加密一个文件 472
加密文件数据 473
解密过程 474
加密文件的备份 474
实验:查看EFS信息 475
加密文件的复制 475
12.10 本章总结 476
第13章 启动和停机 477
13.1 引导过程 477
BIOS引导准备 477
BIOS引导扇区和Bootmgr 481
UEFI引导过程 495
从iSCSI引导 496
初始化内核和执行体子系统 497
实验:加载器参数块 497
Smss、Csrss和Wininit 504
未完成的文件重命名操作 507
ReadyBoot 509
自动启动的映像文件 510
实验:Autoruns 511
13.2 引导和启动问题的故障检查 511
最后已知的好配置 512
安全模式 512
安全模式下的驱动程序加载 513
能感知安全模式的用户程序 514
安全模式下的引导日志 515
Windows恢复环境(WinRE) 516
引导状态文件 519
解决常见的引导问题 520
MBR损坏 520
引导扇区损坏 520
BCD的错误配置 520
系统文件损坏 521
Windows资源保护 522
System储巢损坏 523
启动屏幕之后的崩溃或者挂起 523
13.3 停机 525
实验:验证HungAppTimeout值 526
13.4 本章总结 528
第14章 崩溃转储分析 529
14.1 Windows为什么会崩溃 529
14.2 蓝屏 530
Windows崩溃的原因 531
14.3 诊断崩溃问题 533
14.4 崩溃转储文件 535
实验:查看转储文件的信息 539
崩溃转储的生成 540
14.5 Windows错误报告 542
14.6 在线崩溃分析 543
14.7 基本的崩溃转储分析 545
Notmyfault 545
基本的崩溃转储分析 546
详细的分析 547
14.8 使用崩溃诊断工具 549
缓冲区溢出、内存破坏和特殊内存池 550
实验:通过驱动程序检验器启用特殊内存池 552
代码改写和系统代码写保护 553
14.9 高级的崩溃转储分析 554
栈破坏 555
挂起的或无响应的系统 557
实验:利用LiveKd来生成Hyper-V客户的转储 559
当没有崩溃转储时 561
实验:附载一个内核调试器 562
14.10 对常见停止代码的分析 564
0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564
0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566
0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567
0xC5 - DRIVER_CORRUPTED_EXPOOL 569
硬件故障 571
实验:蓝屏屏幕保护程序 572
14.11 本章小结 572
^ 收 起
Mark Russinovich(马克・拉希诺维奇)是微软windows Azure组技术人员,是Sysinternals工具的作者之一,合著了《深入解析Windows操作系统》系列图书;David A.Solomon(大卫・A.所罗门)是《深入解析Windows操作系统》系列图书的合著者,并为全球成千上万的开发人员和IT专业人士,包括微软员工,讲授Windows内幕课程。他时常在微软举办的会议中发言,包括TechNet和PDC
范德成,2004年毕业于上海交通大学,在微软和SAP公司有多年项目经验,构建了微型开源项目Robbie's Shell.潘爱民,任职于阿里巴巴,长期从事软件和系统技术的研究与开发工作,撰写了大量软件技术文章,著译了多部经典计机图书,在国内外学术刊物上发表了30多篇文章。曾经任教于北京大学和清华大学(兼职),后进入工业界,先后任职于微软亚洲研究院、盛大网络发展有限公司和阿里云计算有限公司,目前也是工信部移动操作系统专家组成员。潘爱民先生获得了数学学士学位和计算机科学博士学位,主要研究领域包括软件设计、信息安全、操作系统和互联网技术。
^ 收 起
范德成,2004年毕业于上海交通大学,在微软和SAP公司有多年项目经验,构建了微型开源项目Robbie's Shell.潘爱民,任职于阿里巴巴,长期从事软件和系统技术的研究与开发工作,撰写了大量软件技术文章,著译了多部经典计机图书,在国内外学术刊物上发表了30多篇文章。曾经任教于北京大学和清华大学(兼职),后进入工业界,先后任职于微软亚洲研究院、盛大网络发展有限公司和阿里云计算有限公司,目前也是工信部移动操作系统专家组成员。潘爱民先生获得了数学学士学位和计算机科学博士学位,主要研究领域包括软件设计、信息安全、操作系统和互联网技术。
^ 收 起
本书是Windows技术**参考书的*新版本,本书主要介绍了基于Windows 7 and Windows Server 2008 R2的核心技术与底层技术,全面阐释Windows技术机理,是广大Windows开发人员必备的参考书。
比价列表
1人想要
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠