内容简介
第8章 I/O系统
8.1 I/O系统组件
I/O管理器
典型的I/O处理过程
8.2设备驱动程序
设备驱动程序的类型
WDM驱动程序
分层的驱动程序
实验:查看已加载的驱动程序列表
驱动程序的结构
驱动程序对象和设备对象
实验:看一看设备对象
实验:显示驱动程序和设备对象
打开设备
实验:查看设备句柄
实验:查看Windows设备名称之间的映射
8.3 I/O处理
I/O类型
同步I/O和异步I/O
快速I/O
实验:查看一个驱动程序登记的快速I/O例程
映射文件I/O和文件缓存
分散/聚集I/O
I/O请求包
IRP栈单元
实验:查看驱动程序的分发例程
实验:查看一个线程的未完成IRP
IRP缓冲区管理
针对单层驱动程序的I/O请求
为一个中断提供服务
完成一个I/O请求
同步
针对分层的驱动程序的I/O请求
实验:查看一个设备栈
实验:查看IRP
线程无关I/O
I/O取消
用户发起的I/O取消
线程终止时的I/O取消
实验:调试一个无法被杀死的进程
I/O完成端口
IoCompletion对象
使用完成端口
I/O完成端口操作
I/O优先级支持
I/O优先级
优先化策略
I/O优先级反转的避免(I/O优先级继承)
I/O优先级提升和撞升
实验:“非常低”和“正常”I/O吞吐量的对比
实验:I/O优先级提升/撞升的性能分析
带宽预留(计划的文件I/O)
容器通知
驱动程序检验器(Driver Verifier)
8.4内核模式驱动程序框架(KMDF)
KMDF驱动程序的结构和操作
实验:显示KMDF驱动程序
KMDF数据模型
KMDF的I/O模型
8.5用户模式驱动程序框架(UMDF)
8.6即插即用(PnP)管理器
即插即用支持的级别
驱动程序对于即插即用的支持
驱动程序加载、初始化和安装
Start值
设备列举
实验:将设备树转储出来
设备栈
设备栈的驱动程序加载
实验:在设备管理器中查看详细的devnode信息
驱动程序安装
实验:检查一个驱动程序的INF文件
实验:查看目录(catalog)文件
8.7电源管理器
电源管理器的操作
驱动程序的电源操作
实验:查看一个驱动程序的电源映射关系
实验:查看系统的电源能力和策略
驱动程序和应用程序对于设备电源的控制
电源可用性请求
实验:在调试器中查看一个电源可用性请求
实验:利用Powercfg查看电源可用性请求
处理器电源管理(PPM)
核心停运的策略
利用率函数
实验:查看利用率和频率的信息
实验:查看利用率和频率的历史
算法覆盖
增加/减少动作
各种阈值和策略的设置
实验:查看当前的核心停运策略
“性能检查”算法
实验:查看当前的PPM检查信息
8.8本章总结
第9章 存储管理
9.1有关存储的术语
9.2磁盘设备
旋转磁盘
磁盘的扇区格式
固态硬盘
NAND型闪存
文件的删除和irim命令
9.3磁盘驱动程序
Winload
磁盘类、端口和小端口驱动程序
iSCSI驱动程序
多路径I/O(MPIO)驱动程序
实验:观察物理磁盘I/O
磁盘设备对象
分区管理器
9.4卷的管理
基本磁盘
MBR风格的分区
GPT(GUID分区表)分区方案
基本磁盘卷管理器
动态磁盘
LDM数据库
实验:使用LDMDump来查看LDM数据库
LDM和GPT或MBR风格的分区方案
动态磁盘的卷管理器
多分区卷的管理
跨距卷
条带卷
实验:观察镜像卷的I/O操作
RAID-5卷
卷名字空间
挂载管理器
挂载点
卷的挂载
实验:查看VPB
卷的I/O操作
虚拟磁盘服务
9.5虚拟硬盘(VHD文件)支持
附载VHD的操作
嵌套的文件系统
9.6 BitLocker驱动器加密
加密密钥
可信平台模块(TPM)
BitLocker引导过程
BitLocker密钥的恢复
全卷加密驱动程序
BitLocker的管理
BitLocker To Go
9.7卷影像(shadow)拷贝服务
影像拷贝
“克隆”影像拷贝
“写时复制”影像拷贝
VSS的架构
VSS的操作
影像拷贝提供者
实验:查看Microsoft影像拷贝提供者的过滤型设备对象
Windows中的用途
备份
实验:查看影像卷的设备对象
“之前的版本”和系统还原
实验:导航到“之前的版本”
实验:映射卷影像设备对象
9.8本章总结
第10章 内存管理
10.1内存管理器简介
内存管理器组件
内部同步
检查内存的使用情况
实验:查看系统内存信息
10.2内存管理器提供的服务
大页面和小页面
保留页面和提交页面
实验:保留的页面对比提交的页面
提交限额
锁住内存
分配粒度
共享内存和映射文件
实验:查看内存映射文件
保护内存
“不可执行”页面保护
实验:查看进程上的DEP保护
软件的数据执行保护
写时复制
地址窗口扩展
10.3内核模式堆(系统内存池)
内存池的大小
实验:确定最大的池大小值
监视内存池的使用
实验:诊断内存池泄漏
快查表(Look-Aside List)
实验:查看系统的快查表
10.4堆管理器
堆的类型
堆管理器结构
堆同步
低碎片堆
堆的安全特性
堆的调试特性
pageheap
容错堆
10.5虚拟地址空间的布局结构
x86地址空间的布局结构
实验:检查一个应用程序能否感知大地址空间
x86系统地址空间的布局结构
x86会话空间
实验:查看会话
实验:查看会话空间的使用情况
系统页表项(PTE,Page Table Entry)
实验:查看会话空间的使用情况
64位地址空间布局结构
x64虚拟寻址的限制
Windows x64的16TB限制
动态的系统虚拟地址空间管理
实验:查询系统虚拟地址的用量
实验:设置系统虚拟地址的限制值
系统的虚拟地址空间配额
用户地址空间的布局结构
实验:对用户虚拟地址空间进行分析
映像随机化
栈的随机化
堆的随机化
内核地址空间中的ASLR
对安全性缓和措施的控制
实验:查看进程上的ASLR保护
10.6地址转译
x86虚拟地址转译
页目录
实验:检查页目录和PDE
页表和页表项
页表项中硬件和软件的“写”位
页面内的字节
地址转译快查缓冲区
物理地址扩展(PAE)
实验:转译地址
x64虚拟地址转译
IA64虚拟地址转译
10.7页面错误处理
无效PTE
原型PTE
页面换入I/O
冲突的页面错误
聚簇的页面错误
页面文件
实验:查看系统页面文件
提交用量和系统提交限额
提交用量和页面文件的大小
实验:利用任务管理器来查看页面文件使用量
10.8栈
用户栈
实验:创建最大数量的线程
内核栈
实验:观察内核栈的使用量
DPC栈
10.9虚拟地址描述符
进程的VAD
实验:查看虚拟地址描述符
旋转VAD
10.10 NUMA
10.11内存区对象
实验:查看内存区对象
实验:查看控制区域
10.12驱动程序检验器
10.13页面帧编号数据库
实验:查看PFN数据库
页面列表的动态变化
实验:空闲列表和零页面列表
实验:已修改列表和备用列表
页面优先级
实验:观察区分优先级的备用列表
已修改页面写出器
PFN数据结构
实验:查看PFN项
10.14物理内存的限制
Windows客户版本的限制
32位客户的有效内存限制
10.15 工作集
按需换页
逻辑预取器
实验:窥探预取文件内部
实验:观察预取文件的读和写
放置策略
工作集管理
实验:查看进程工作集大小
实验:工作集与虚拟大小
实验:在调试器中查看工作集列表
平衡集管理器和交换器
系统工作集
内存通知事件
实验:查看内存资源通知事件
10.16主动式内存管理(Superfetch)
各个组件
跟踪过程和日志记录
场景
页面优先级和重平衡
鲁棒性能
RAM优化软件
ReadyBoost
ReadyDrive
统一缓存
进程反射
实验:利用Preflect来观察进程反射的行为
10.17本章总结
第11章 缓存管理器
11.1缓存管理器的关键特性
单个中心化的系统缓存
内存管理器
缓存一致性
虚拟块缓存
流式缓存机制
对可恢复文件系统的支持
11.2缓存的虚拟内存管理
11.3缓存的大小
缓存的虚拟大小
缓存的工作集大小
实验:查看系统缓存的工作集
缓存的物理大小
11.4缓存的数据结构
系统范围的缓存数据结构
实验:查看系统缓存的工作集
针对每个文件的缓存数据结构
实验:查看共享的和私有的缓存表
11.5文件系统接口
从缓存中来回拷贝数据
通过映射和锁定接口进行缓存
通过直接内存访问接口进行缓存
11.6快速I/O
11.7预读(Read Ahead)和滞后写(Write Behind)
智能预读
回写缓存(Write-Back Caching)和延迟写(Lazy Writing)
实验:观察缓存管理器的活动情况
禁止一个文件的延迟写出行为
强迫缓存被直写(write-through)到磁盘上
刷新映射文件
实验:观察缓存的刷新
写节流(Write Throttling)
实验:查看写节流参数
系统线程
11.8本章总结
第12章 文件系统
12.1 Windows文件系统格式
CDFS
UDF
FAT12、FAT16和FAT32
exFAT
NTFS
12.2文件系统驱动程序总体结构
本地FSD
远程FSD
锁定
实验:查看已注册文件系统的列表
文件系统操作
显式文件I/O
内存管理器的修改页面写出器和映射页面写出器
缓存管理器的延迟写出器(Lazy Writer)
缓存管理器的预读线程
内存管理器的页面错误处理器
文件系统过滤型驱动程序
进程监视器
实验:查看进程监视器的过滤型驱动程序
12.3诊断文件系统的问题
进程监视器的基本和高级模式
实验:在一个空闲系统上查看文件系统的活动
进程监视器诊断技巧
12.4公用日志文件系统
列集操作
日志的类型
日志的布局结构
日志序列号
日志块
所有者页面
虚拟LSN到物理LSN的转译
管理策略
12.5 NTFS设计目标和特性
高端(High-End)文件系统的需求
可恢复性
安全性
数据冗余和容错能力
NTFS的高级特性
多数据流
实验:查看数据流
基于Unicode的名称
通用的索引设施
动态的坏簇重新映射
硬链接(link)和交接(junction)
实验:创建一个硬链接
符号(软)链接和交接(junction)
实验:创建一个符号链接
压缩文件和稀疏文件
变化日志
针对每个用户的卷配额
链接跟踪
加密
POSIX支持
碎片整理
动态分区
12.6 NTFS文件系统驱动程序
12.7 NTFS在磁盘上的结构
卷(volume)
簇(cluster)
主文件表(MFT)
实验:查看NTFS信息
文件记录号
文件记录
文件名
隧道传输
驻留的和非驻留的属性
数据压缩和稀疏文件
压缩稀疏数据
压缩非稀疏数据
稀疏文件
变化日志文件
实验:读取变化日志
索引
对象ID
配额跟踪
统一的安全性
重解析点
事务支持
隔离性
实验:理解和管理事务
事务型API
资源管理器
实验:查询资源管理器的信息
磁盘上的实现
日志的实现
恢复的实现
12.8 NTFS的恢复支持
设计
元数据日志记录
日志文件服务(LFS)
日志记录类型
恢复
分析扫描(Analysis Pass)
重做扫描(Redo Pass)
撤销扫描(Undo Pass)
NTFS的坏簇恢复
自我修复
12.9加密文件系统(EFS)安全性
第一次加密一个文件
加密文件数据
解密过程
加密文件的备份
实验:查看EFS信息
加密文件的复制
12.10本章总结
第13章 启动和停机
13.1引导过程
BIOS引导准备
BIOS引导扇区和Bootmgr
UEFI引导过程
从iSCSI引导
初始化内核和执行体子系统
实验:加载器参数块
Smss、Csrss和Wininit
未完成的文件重命名操作
ReadyBoot
自动启动的映像文件
实验:Autoruns
13.2引导和启动问题的故障检查
最后已知的好配置
安全模式
安全模式下的驱动程序加载
能感知安全模式的用户程序
安全模式下的引导日志
Windows恢复环境(WinRE)
引导状态文件
解决常见的引导问题
MBR损坏
引导扇区损坏
BCD的错误配置
系统文件损坏
Windows资源保护
System储巢损坏
启动屏幕之后的崩溃或者挂起
13.3停机
实验:验证HungAppTimeout值
13.4本章总结
第14章 崩溃转储分析
14.1 Windows为什么会崩溃
14.2蓝屏
Windows崩溃的原因
14.3诊断崩溃问题
14.4崩溃转储文件
实验:查看转储文件的信息
崩溃转储的生成
14.5 Windows错误报告
14.6在线崩溃分析
14.7基本的崩溃转储分析
Notmyfault
基本的崩溃转储分析
详细的分析
14.8使用崩溃诊断工具
缓冲区溢出、内存破坏和特殊内存池
实验:通过驱动程序检验器启用特殊内存池
代码改写和系统代码写保护
14.9高级的崩溃转储分析
栈破坏
挂起的或无响应的系统
实验:利用LiveKd来生成Hyper-V客户的转储
当没有崩溃转储时
实验:附载一个内核调试器
14.10对常见停止代码的分析
0xD1-DRIVER_IRQL_NOT_LESS_OR_EQUAL
0x8E-KERNEL_MODE_EXCEPTION_NOT_HANDLED
0x7F-UNEXPECTED_KERNEL_MODE_TRAP
0xC5-DRIVER_CORRUPTED_EXPOOL
硬件故障
实验:蓝屏屏幕保护程序
14.11本章小结