Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
1
王 雷北京航空航天大学计算机系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
2
内容
Windows 2000/XP内存管理
Windows 2000/XP外存管理
Windows 2000/XP高速缓存管理
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
3
工具
www.ntinternals.com
Nt
Nt资源包
Platform SDK
NT DDK
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
4
调试工具
CDB.exe
i386kd.exe
windbg.exe
softice(www.numega.com)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
5
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
6
配置
配臵宿主机调试环境
双机串口通讯连接
目标机的 WINDOWS启动时加上 /debug
参数
安装与目标机系统相匹配的 Symbol文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
7
kd> !processfields
Pcb,0x0
ExitStatus,0x68
LockEvent,0x6c
LockCount,0x7c
CreateTime,0x80
ExitTime,0x88
LockOwner,0x90
UniqueProcessId,0x94
ActiveProcessLinks,0x98
QuotaPeakPoolUsage[0],0xa0
QuotaPoolUsage[0],0xa8
PagefileUsage,0xb0
CommitCharge,0xb4
PeakPagefileUsage,0xb8
PeakVirtualSize,0xbc
VirtualSize,0xc0
Vm,0xc8
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
8
LastProtoPteFault,0xf8
DebugPort,0xfc
ExceptionPort,0x100
ObjectTable,0x104
Token,0x108
WorkingSetLock,0x10c
WorkingSetPage,0x12c
ProcessOutswapEnabled,0x130
ProcessOutswapped,0x131
AddressSpaceInitialized,0x132
AddressSpaceDeleted,0x133
AddressCreationLock,0x134
ForkInProgress,0x158
VmOperation,0x15c
VmOperationEvent,0x160
PageDirectoryPte,0x164
LastFaultCount,0x168
VadRoot,0x170
VadHint,0x174
CloneRoot,0x178
NumberOfPrivatePages,0x17c
NumberOfLockedPages,0x180
ForkWasSuccessful,0x15e
ExitProcessCalled,0x186
CreateProcessReported,0x187
SectionHandle,0x188
Peb,0x18c
SectionBaseAddress,0x190
QuotaBlock,0x194
LastThreadExitStatus,0x198
WorkingSetWatch,0x19c
InheritedFromUniqueProcessId,0x1a4
GrantedAccess,0x1a8
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
9
kd> !process 0
PROCESS 80147120 Cid,0000 Peb,00000000 ParentCid,0000
DirBase,00030000 ObjectTable,80731e88 TableSize,254.
Image,Idle
VadRoot 0 Clone 0 Private 0,Modified 0,Locked 0.
801472DC MutantState Locked OwningThread 0
Process Lock Owned by Thread 0
Token e1000750
ElapsedTime 7:41:18.0524
UserTime 0:00:00.0000
KernelTime 9:34:32.0780
QuotaPoolUsage[PagedPool] 0
QuotaPoolUsage[NonPagedPool] 0
Working Set Sizes (now,min,max) (4,50,450) (16KB,200KB,1800KB)
PeakWorkingSetSize 4
VirtualSize 0 Mb
PeakVirtualSize 0 Mb
PageFaultCount 1
MemoryPriority BACKGROUND
BasePriority 0
CommitCharge 0
THREAD 80147320 Cid 0.0 Teb,00000000 Win32Thread,00000000 RUNNING
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
10
内存管理
组成部分
地址空间的布局
地址转换机制
内存分配方式
缺页处理
工作集
物理内存管理
其他内存相关机制
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
11
组成部分
一组执行体系统服务程序,用于虚拟内存的分配,回收和管理 。 大多数这些服务都是通过 Win32 API 或内核态的设备驱动程序接口形式出现 。
一个转换无效和访问错误陷阱处理程序用于解决硬件监测到的内存管理异常,
并代表进程将虚拟页面装入内存 。
六个的关键组件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
12
工作集管理器 ( 16优先 ):当空闲内存低于某一界限时,便启动所有的内存管理策略,如:工作集的修整,老化和已修改页面的写入等 。
进程 /堆栈交换程序 ( 23优先 ),完成进程和内核线程堆栈的换入和换出操作 。
已修改页面写入器 ( 17优先 ),将修改链表上的,脏,页写回到适当的页文件 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
13
映射页面写入器 ( 17优先 ),将映射文件中脏页写回磁盘 。
废弃段线程 ( 18优先 ),负责系统高速缓存和页面文件的扩大和缩小 。
零页线程 ( 0优先 ),将空闲链表中的页面清零 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
14
内存布局应用程序代码全程变量每个线程堆栈
DLL代码 3GB用户空间
1GB系统空间
7FFFFFFF
80000000 内核和执行体
HAL
引导驱动程序
C0000000 进程页表 BFFFFFFF
超空间
C0000000
C0800000 系统高速缓存分页缓冲池未分页缓冲池
FFFFFFFF FFFFFFFF
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
15
系统代码 (Ntoskrnl,HAL) 和一些系统中初始的未分页缓冲池系统映射视图(例如,Win32k.sys)或者会话空间超空间和进程工作集列表进程的页表和页目录附加的系统 PTE(高速缓存可以扩展到这)
没有使用,不可访问
HAL使用故障转储信息未分页缓冲池扩充系统 PTE
分页缓冲池系统高速缓存系统工作集列表
80000000
C0800000
C0400000
C0000000
A4000000
A0000000
FFBE0000
EB000000(min)
E1000000
C1000000
C0C00000
FFC00000
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
16
系统代码 包括操作系统映像,HAL和用于引导系统的设备驱动程序 。
系统映射视图 用来映射 Win32子系统可加载的核心态部分 Win32k.sys,以及它使用的核心态图形驱动程序。
会话空间 用来映射一个用户的会话信息。
进程页表和页目录 描述虚拟地址映射的结构。
超空间 一个特殊的区域用来映射进程工作集链表,并为创建临时映射物理页面。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
17
系统工作集链表 描述系统工作集的工作集链表数据结构。
系统高速缓存 用来映射在系统高速缓存中打开的文件的虚拟空间。
分页缓冲池 可分页系统内存堆。
系统页表项 系统 PTE缓冲池,用来映射系统页面。
非分页缓冲池 不可分页的系统内存堆。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
18
地址变换过程核心进程页目录索引 页表索引 字节索引
CR3 物理地址
Index
PFN
PDE
页目录
( 每个进程建立一张,1024项 )
Index
PFN
PTE
页表
( 每个进程最多有 512个,系统空间最多占用 512
个,每张表 1024项 )
Index
物理地址空间要求的字节要求的页
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
19
进程
.
.
.
.
.
.
.
.
.
进程 1
的页表进程 2
的页表
PTE 0
进程 1的页目录进程 2的页目录
PTE 0
PDE 0 PDE 0
System PTE 0
PDE 511
PDE 512
PDE n PDE n
PDE 512
PDE 511
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
System PTE n
.
.
.
系统页表进程仍然没有访问系统页表各进程私有
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
20
快表 TLB
.
.
.
虚页 5 页框 290
虚页 64 无效虚页 17 页框 1004
虚页 65 页框 801
虚页 6 页框 14
虚页 7 无效
TLB
虚页号,17
虚拟地址同时读取并比较匹配
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
21
内存分配方式
以页单位的虚拟内存函数( Virtualxxx),
– 保留与提交
内存映射文件函数( CreateFileMapping,
MapViewOfFile),
堆函数( Heapxxx 和早期的接口
Localxxx 和 Globalxxx)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
22
虚拟地址描述符范围,20000000到 2000FFFF
保护限制:读 /写继承:有范围,00002000到 0000FFFF
保护限制:只读继承:无范围,4E000000到 4F000000
保护限制:复制可写入继承:有范围,32000000到 3300FFFF
保护限制:只读继承:无范围,7AAA0000到 7AAA00FF
保护限制:读 /写继承:无
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
23
内存映射文件
加载和执行,exe和 dll文件,这可以节省应用程序启动所需的时间;
访问磁盘上的数据文件,这可以减少文件 I/O,并且不必对文件进行缓存;
实现多个进程间的数据共享 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
24
区域对象 (section object)
区域创建区域打开区域扩展区域映射 /非映射视图查询区域最大规模页保护限制页文件 /映射文件基准的 /非基准的对象类型对象体属性服务程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
25
文件对象虚拟地址描述符数据区控制区域子区段原型页表项页框号数据库项文件对象区域对象页目录 页表映像区控制区域 ( 如果文件是一个执行的映像 )
区域对象指针下个子区
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
26
建立过程
打开文件,区域对象可以连接到已打开的磁盘文件
(映射文件),或是已提交的内存(提供共享内存)。
可以调用 Win32函数 CreateFileMapping创建区域对象,
其参数包括映射到区域对象的文件句柄(或是
INVALID_HANDLE_VALUE表示页文件支持区域)。
如果区域有名字,其它进程可以用 OpenFileMapping
打开它。
设备驱动程序也可以使用 ZwOpenSection,
ZwMapViewOfSection,和 ZwUnmapViewOfSection函数操纵区域对象。
MapViewOfFile函数映射区域对象的一部分,并指定映射范围。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
27
堆函数
缺省进程堆,通常是 1MB大小
HeapCreate函数创建另外的私有堆,
HeapDestroy删除。
串行化选项。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
28
系统内存分配
非分页缓冲池 由系统虚拟地址组成,它们长期驻留在物理内存中,在任何时候都可以被访问到(从任何 IRQL级和任何进程上下文),而不会发生页错误。
需要未分页缓冲池的一个原因是:页错误不能满足在
DPC/调度级或更高。
分页缓冲池 是系统可以被分页和分出系统的空间中虚拟内存的一个区域。不必从 DPC/调度级或更高一级访问内存的设备驱动程序可以使用分页缓冲池。它从任何进程上下文都是可访问的。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
29
系统有两种非分页缓冲池:一种在一般情况下使用,另一种小型的( 4页)缓冲池在非分页缓冲池已满并且调用者不能允许分配失败时,紧急使用。
单处理机系统有三个分页缓冲池;多处理机系统有五个。
后备链表 (Look-Aside Lists)。
Ex…
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
30
缺页处理
无效的页表项
– 页文件
– 请求零页
– 转换
– 未知
原型页表项
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
31
PFN
页目录原型页表 物理存储器页表有效 -PFN n
无效 -指向原型 PTE
段结构有效 -PFN 5
无效 -在页文件中
PFN n
PFN n
页帧号数据库项
PTE地址共享数量 =1
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
32
页面调入 I/O
向文件(页或映射文件)发出读操作来解决缺页问题
同步的
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
33
问题
同一进程中的另一线程,或一个其它的进程,
都可能由于一个相同的页面导致缺页错误 。
( 称为,冲突页错误,,将在下节中介绍 ) 。
页面可能已经从虚拟地址空间中被删除 ( 并重新映射 ) 。
页面的保护限制可能发生了变化 。
错误可能是由一个原型页表项引发的,并且这个原型页表项所映射的页面可能并不在工作集中 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
34
冲突页错误 (collided page fault)
页面调度程序检测
等待操作
I/O操作完成后,所有等待该事件的线程都会被唤醒
第一个获得页框号数据库锁的线程负责执行页面调入完成操作。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
35
页文件
最多 16个页文件
以非压缩的形式被创建
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
36
工作集
进程工作集
系统工作集
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
37
系统工作集
系统高速缓存页面
分页缓冲池
Ntoskrnl.exe中可分页的代码和数据
设备驱动程序中可分页的代码和数据
系统映射视图 ( 部分映射在 0xA0000000
处,如 Win32k.sys)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
38
取页策略:内存管理器利用请求式页面调度算法以及簇方式将页面装入内存
臵页策略:选择页框应使 CPU内存高速缓存不必要的震荡最小
换页策略
– 在多处理器系统中,Windows 2000/XP采用了局部先进先出臵换策略。而在单处理器系统中,Windows 2000/XP的实现更接近于最近最少使用策略( LRU) (称为“轮转算法”,用于大多数版本的 UNIX)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
39
物理内存管理
活动 ( 又称有效 )
过渡 (Transition)
后备 (stand by)
修改
修改不写入
空闲
零初始化 (zeroed)
坏
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
40
进程 1的页表进程 3的页表页框号数据库有效无效:磁盘地址无效:迁移
...
进程 2的页表有效无效:磁盘地址有效
...
...
有效无效:迁移无效:磁盘地址使用中后备链表使用中使用中修改链表
...
原型页表项前向指针后向指针
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
41
物理内存管理零初始化当前页框号数据库
■
当前当前
■
■
■
...
空闲后备坏修改修改不写入
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
42
进程工作集后备页链表修改页面写回程序修改页链表空闲页链表零初始化页面线程零初始化页链表 坏页链表,软,缺页故障工作集重置从外存或内核配置读入的页面需求零缺页故障
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
43
锁内存
设备驱动程序可以调用核心态函数
MmProbeAndLockPages,MmLock
PagableCodeSection,
MmLockPagableDataSection,或者
MmLockPagableSection ByHandle。
Win32应用程序可以调用 VirtualLock函数锁住进程工作集中的页面。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
44
内存保护机制
所有系统范围内核心态组件使用的数据结构和内存缓冲池只能在核心态下访问。
每个进程有一个独立、私有的地址空间,
禁止其它进程的线程访问。
支持的处理机还提供了一些硬件内存保护措施(如读 /写,只读等)。
共享内存区域对象具有标准的
Windows2000/XP存取控制表( ACLs)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
45
写时复制进程地址空间原始数据进程地址空间原始数据页3
页2
页1
物理内存页3
页2
页1
物理内存进程地址空间原始数据页2 的拷贝进程地址空间修改的数据
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
46
物理地址扩展
KPROCESS
页目录指针索引 页表索引页内字节偏移
CR3 物理地址
Index
页目录
( 每进程最多四张,每张 512项,
8字节宽 )
Index
PFN
PTE
页表
( 每张 512项,
8字节宽 )
Index
物理地址空间要求的字节要求的页页目录索引
PDE
PFN
Index
PFN
PDE
Index
页目录指针
( 每进程一个,4项 )
31 29 20 11
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
47
地址窗口扩充物理内存
AWE 窗口
4GB
0
2GB
64GB
服务器程序地址空间系统地址空间用户地址空间
AWE内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
48
外存管理
Windows 2000/XP存储的演变
分区( Partitioning)
驱动程序 (Drivers)
多重分区管理 (Multipartition Volume
Management)
卷名字空间 (The Volume Namespace)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
49
存储的演变
让 MS— DOS在一个物理盘上采用多个分区,
也就是逻辑盘
Windows NT借鉴了 MS— DOS的分区机制,
扩展了 MS— DOS分区的基本概念,支持企业级操作系统所需的一些存储管理的特征:跨磁盘管理( disk spanning)和容错( fault tolerance)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
50
早期磁盘管理的缺点
对大多数磁盘设置的改变需要重启操作系统才能生效
NT的注册表中为 MS— DOS方式的分区保存了多分区磁盘的配置信息
每个卷有一个唯一的从 A到 Z的驱动器名
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
51
盘一种物理存储设备。
扇区可寻址的大小固定的块。
分区是盘上连续扇区的集合。
简单卷代表文件系统驱动程序作为一个独立单元管理来自一个分区的所有扇区。
多分区卷它代表文件系统驱动程序作为一个独立单元管理来自多个分区的所有扇区。多分区卷提供简单卷所不支持的性能、可靠性和大小等特性。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
52
分区
基本分区
动态分区
– 逻辑磁盘管理子系统 (LDM)负责
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
53
LDM
LDM的数据库存在于每个动态盘最后的 1MB
保留空间中。
LDM实现了一个 MS DOS的分区表,这是为了继承一些在 Windows2000/XP下运行的磁盘管理工具,或是在双引导环境中让其它系统不至于认为动态盘还没有被分区。
由于 LDM分区在磁盘的 MS DOS分区表中并没有体现出来,所以被称为软分区,而 MS DOS
分区被称为硬分区。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
54
主引导记录
1MB
LDM数据库LDM分区区域动态盘的内部组织
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
55
内容表 处理日志数据库记录
1MB
私有头镜像数据库记录头私有头
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
56
数据库结构
私有头,GUID,磁盘组的名字 ( 该名字是由 Dg0和计算机的名字一起组成,例如 SusanDg0,意味着计算机的名字是 Susan) 和一个指向数据库内容表的指针 。 为了保证可靠性,LDM在磁盘的最后一个扇区保存了私有头的拷贝 。
数据库内容表有 16个扇区大小,其中包含关于数据库布局的信息 。
数据库记录区域紧接着内容表,并将内容表后第一个扇区作为数据库记录头 。 这个扇区中存储了数据库记录区的信息,包括其所包含的记录个数,数据库相关的磁盘组的名字和 GUID,以及 LDM用于创建下一项的序列号 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
57
数据库中的每一项可以是如下四种类型之一:分区,
磁盘,组件,卷 。 LDM把每一项与内部对象的标识符联系到一起 。 在最低的级别,分区项描述软分区,它是在一个盘上的连续区域 。 存储在分区项中的标识符把这个项与一个组件和一个磁盘项联系起来 。 磁盘项代表一个磁盘组中的动态盘,包括磁盘的 GUID。 组件项像一条链子把一个或多个分区项和与分区相连的卷项联系起来 。 卷项存放这个卷的 GUID,卷的大小和状态,
驱动器的名字 。 比一个数据库记录大的磁盘项占用多个记录的空间,分区项,组件项和卷项很少占用多个记录的空间 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
58
LDM需要三个项来描述一个简单卷:分区项,组件项和卷项 。 分区项描述系统分配给某个卷的磁盘上的一个区域,组件项把一个分区项和一个卷项联系起来,卷项中包含 Windows 2000/XP内部用来识别卷的 GUID。 多分区卷需要的项数多于三个 。 例如,一个条带卷包括最少两个分区项,一个组件项和一个卷项 。 唯一一种含有一个以上组件项的卷的类型是:镜像卷 。 镜像卷含有两个组件项,每个只表示这个镜像的一半 。 LDM为每个镜像卷使用两个组件项的目的是:当一个镜像破坏时 LDM能够在组件一级将他们分割开来,并创建两个各含有一个组件项的卷 。 因为简单卷需要三个项,而
1MB数据库空间大约可以容纳 8000个项,所以在
Windows 2000/XP中可以创建的卷数目的有效上界大约是 2500个 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
59
LDM数据库的最后部分是事务处理日志区,
它包含的几个扇区在数据库信息改变时用来存储备份信息。这样确保在系统崩溃或断电时,LDM能够利用日志把系统恢复到一个正确的状态。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
60
驱动程序
系统卷中引导扇区中的代码负责执行 Ntldr。
Ntldr从系统卷中读取 Boot.ini文件,把计算机的引导选项显示给用户。 Boot.ini指定分区名为 mult(0)disk(0)rdisk(0)partition(1)
的形式。
Ntldr把 Boot.ini中用户指定的项转换为正确的引导分区,然后将 Windows 2000/XP系统文件(从注册表,Ntoskrnl.exe、引导驱动程序开始)装入内存,继续引导过程。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
61
Windows 2000/XP的存储驱动程序
– 类:实现所有存储设备共同的功能
– 端口:基于某种特定总线设备的共同功能,如 SCSI、
IDE
– 小端口,OEM提供
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
62
磁盘的类驱动程序使用 I/O管理器的
IoReadPartitionTable函数识别表示分区的设备对象
设备名
– \Device\Harddisk0\DP(1)0x7e000-
0x7ff50c00+2
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
63
Windows 2000/XP保存了两个不同的名字空间子目录供
Win32使用,其中之一是,\子目录 ( 另一个是
\BaseNamedObjects 子目录 ) 。
在 \子目录中,Windows 2000/XP创建了一些与 Win32
程序交互的硬件对象,包括串口和并口,还有磁盘 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
64
由于磁盘对象实际上存在于其它的子目录中,所以
Windows 2000/XP使用符号链接,把在 \子目录下的名字与在名字空间其它地方的对象联系起来 。 I/O管理器 为 系 统 中 的 每 一 个 物 理 盘 都 创 建 一 个
\\PhysicalDriveX 的 链 接,指向
\Device\HarddiskX\Partition0( 从零开始的数字来替代 X) 。
那些直接访问磁盘扇区的 WIN 32应用程序可以调用
Win32 函数 CreateFile,通过指定 \\.\PhysicalDriveX
( X是一个磁盘的号码 ) 作为参数来打开磁盘 。 Win32
的应用层先把名字转化为 \\PhysicalDriveX,然后在把名字提交给 Windows2000/XP对象管理器 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
65
管理 工具
FtDisk和 DMIO负责识别文件系统驱动程序管理的卷,并将 I/O直接从卷映射到组成卷的底层分区 。
对简单卷来说,通过把卷的偏移量加上卷在磁盘中的起始地址,卷管理器可以保证卷的偏移量被转换成盘的偏移量 。
对于多分区卷这就复杂多了,因为组成卷的分区可以是不邻接的分区,甚至可以在不同的磁盘中。有一些多分区卷使用数据冗余技术,所以它们需要更多的卷到磁盘的转换工作。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
66
多重分区管理
跨分区卷 (spanned volume)
条带卷( striped volume)
镜像卷( mirrored volume)
廉价冗余磁盘阵列 5卷( RAID-5 volume)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
67
跨分区卷
C:
100MB
E:
100MB
NTFS
VOLUME1
NTFS
VOLUME2
NTFS
VOLUME 2
NTFS
VOLUME 3
D:
50MB
D:
50MB
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
68
一个单独的逻辑卷,最多由在一个或多个磁盘上的 32个空闲分区组成。
跨分区卷可以用来把小的磁盘空闲区域,
或者把两个或更多的小磁盘组成大的卷。
卷管理器对 Windows 2000/XP的文件系统隐藏了磁盘物理配臵信息。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
69
条带卷( RAID-0卷)
150MB150MB150MB
条1
7
6
5
4
3
2
1
7
6
5
4
3
2
150MB150MB150MB
0 9
8
654321
23
22
2019181716
15
131211107 14
24
21
...25
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
70
一系列分区组成的单独的逻辑卷,最多有 32个分区并且每个盘一个分区。
条带卷中的一个分区不需要占据整个磁盘,唯一的限制是每个盘上的分区大小相同
数据能够被平均分配到每个磁盘上
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
71
镜像卷
c:
c:
(mirror)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
72
一个磁盘上分区的内容被复制另一个磁盘与它等大小的分区中。镜像卷有时也被称为 RAID-
1。
镜像卷能够可以在主分区和镜像分区之间平衡
I/O操作 。 两个读操作可以同时进行,所以理论上只用一半时间就可以完成 。 当修改一个文件时,必须写入镜像卷的两个分区,但是磁盘写操作可以异步进行,所以用户态程序的性能一般不会被这种额外的磁盘更新所影响 。
镜像卷是唯一一种支持系统卷和引导卷的多分区卷。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
73
廉价冗余磁盘阵列 5卷条1
7
6
5
4
3
2
1
7
6
5
4
3
2
奇偶校验磁盘1 磁盘2 磁盘3
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
74
卷名字空间
安装管理器
安装点
卷安装
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
75
安装管理器
安装管理器( Mountmgr.sys)是 Windows
2000/XP中新驱动程序,为在 Window 2000/XP
安装后创建的动态磁盘卷和基本磁盘卷分配驱动器名。
卷管理器创建卷时都将通知它。当接到通知时,
确定新的卷 GUID或者磁盘标记;
安装管理器使用卷 GUID(或者标识)在内部数据库中进行查询
安装管理者使用第一个未分配的驱动器名,为这次分配创建一个符号链接(例如,\\D:)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
76
安装点
实现安装点的技术是再解析点 (Reparse
Point)技术。
C:\Project
CurrentProject\Description.txt
C:\Projects\CurrentProject\Description.t
xt
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
77
卷安装
每个文件系统驱动程序在初始化时都向
I/O管理器注册
每个设备对象包含一个卷参数块 VPB,
但是 I/O管理器认为只有卷设备对象的
VPB是有意义的
安装请求
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
78
安装管理器把 D:分配给系统中的第二个卷
它产生符号连接 \\D:指向设备对象
\Device\HarddiskVolume2。
一个 WIN 32应用程序试图打开 D:上的文件 \Temp\Test.txt时,它将会指定路径 D,
\Temp\Test.txt。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
79
WIN 32子系统在调用 NtCreateFile之前将路径转化为 \\D,\Temp\Test.txt。
I/O管理器将检查
\Device\HarddiskVolume2的 VPB是否引用一个文件系统。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
80
高速缓存
单一集中式系统高速缓存
– 任何数据都能被高速缓存,无论它是用户数据流 ( 文件内容和在这个文件上正在进行读和写的活动 ) 或是文件系统的元数据
( metadata) ( 例如目录和文件头 )
与内存管理器结合
– 因为它采用将文件视图映射到系统虚拟空间的方法访问数据
高速缓存的一致性
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
81
用户地址空间视图1
视图2
系统地址空间进程1虚拟内存视图2
系统地址空间进程2虚拟内存用户地址空间
4GB
系统缓存
2GB
0
映射文件
4GB
系统缓存
2GB
0
控制区域物理内存
SIZE
0
文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
82
虚拟块缓存
– Windows 2000/XP高速缓速管理器用一种虚拟块缓存方式,管理器对缓存中文件的某些部分进行追踪 。 通过内存管理器的特殊系统高速缓存例程将 256-KB大小的文件视图映射到系统虚拟地址空间,高速缓存管理器能够管理文件的这些部分 。 这种方式有以下几个主要特点:
– 它使智能的文件预读成为可能 。
– 它允许 I/O系统绕开文件系统访问已经在缓存中的数据(快速 I/O)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
83
基于流的缓存
可恢复的文件系统支持
– 文件系统写一个日志文件记录,记录将要进行的卷修改操作 。
– 文件系统调用高速缓存管理器将日志文件记录刷新到磁盘上。
– 文件系统把卷修改内容写入高速缓存,即修改文件系统在高速缓存的元数据。
– 高速缓存管理器将被更改的元数据刷新到磁盘上,更新卷结构。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
84
系统代码 (Ntoskrnl,HAL) 和一些系统中初始的未分页缓冲池系统映射视图(例如,Win32k.sys)或者会话空间超空间和进程工作集列表进程的页表和页目录附加的系统 PTE(高速缓存可以扩展到这)
没有使用,不可访问
HAL使用故障转储信息未分页缓冲池扩充系统 PTE
分页缓冲池系统高速缓存系统工作集列表
80000000
C0800000
C0400000
C0000000
A4000000
A0000000
FFBE0000
EB000000(min)
E1000000
C1000000
C0C00000
FFC00000
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
85
视图 0
视图 1
视图 2
视图 3
视图 4
视图 5
视图 6
视图 7
视图 08
视图 n
系统高速缓存节 0
节 1
文件 A(500KB)
节 0
节 1
文件 B(750KB)
节 2
节 0
文件 C(100KB)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
86
高速缓存的大小
缓存区的虚拟大小
缓存的物理大小
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
87
高速缓存的数据结构
在系统高速缓存的每个 256 KB的槽由一个 VACB描述 。
每个打开的被缓存文件有一个专用的缓存映射,它包含了用于控制文件预读的信息 。
每个被缓存的文件有一个单独的共享缓存映射结构,它指向系统缓存中包含此文件映射视图的槽 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
88
虚拟地址控制块 ( VACB)
系统高速缓存中数据的虚拟地址
指向共享高速缓存映射的指针
文件偏移
活动计数
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
89
VACB 0
VACB 7
VACB 6
VACB 5
VACB 4
VACB 3
VACB 2
VACB 1
VACB n
View 1
View n
View 8
View 7
View 6
View 5
View 4
View 3
View 0
View 2
系 统 V A C B 数 组系统缓存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
90
文件 A(500 KB)
节 0
节 1
文件 B(750 KB)
节 0
节 1
节 2
文件 C(100 KB)
节 0
文件 A的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
文件 B的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
文件 C的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
系统 VACB数组
VACB 0
VACB 1
VACB 2
VACB 3
VACB 4
VACB 5
VACB 6
VACB 7
VACB n
系统高速缓存视图 0
视图 1
视图 2
视图 3
视图 4
视图 5
视图 6
视图 7
视图 8
视图 n
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
91
共享的 高速缓存映射
VACB数组
VACB
VACB
VACB
0
0
0
0
0
0
127
127
127
127
127
127
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
92
高速缓存的操作
回写缓存和延迟写
写入文件的数据首先被存储在高速缓存页面的内存中,然后再被写入磁盘。因此,写操作允许在短时间内积累,并一次性刷新到磁盘,这可以减少磁盘的 I/O次数。
屏蔽对文件延迟写
– 在调用 Win32 CreateFile函数时指定
FILE_ATTRIBUTE_TEMPORARY标志创建一个临时文件,延迟写器就不会将脏页写回磁盘,除非物理内存严重不足或文件关闭。
强制写缓存到磁盘
刷新被映射的文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
93
智能预读
虚拟地址预读
– 将被访问页面相近的几个页一起读到内存中 。 内存管理器的这种方法唯一缺点是:必须同步进行
带历史信息的异步预读
– 高速缓存管理器在文件的私有缓存映射结构中为正在被访问的文件句柄保存最后两次读请求的历史信息
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
94
快速 I/O(fast I/O)
写阻塞
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
95
访问缓存数据的方法
,拷贝读取,方法在系统空间中的高速缓存数据缓冲区和用户空间中的进程数据缓冲区之间拷贝用户数据;
,映射暂留,方法使用虚拟地址直接读写高速缓存的数据缓冲区 。
,物理内存访问,方法使用物理地址直接读写高速缓存的数据缓冲区 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
96
cr
os
of
t?
W
indow
s
2
00
0/X
P
1
王 雷北京航空航天大学计算机系
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
2
内容
Windows 2000/XP内存管理
Windows 2000/XP外存管理
Windows 2000/XP高速缓存管理
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
3
工具
www.ntinternals.com
Nt
Nt资源包
Platform SDK
NT DDK
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
4
调试工具
CDB.exe
i386kd.exe
windbg.exe
softice(www.numega.com)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
5
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
6
配置
配臵宿主机调试环境
双机串口通讯连接
目标机的 WINDOWS启动时加上 /debug
参数
安装与目标机系统相匹配的 Symbol文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
7
kd> !processfields
Pcb,0x0
ExitStatus,0x68
LockEvent,0x6c
LockCount,0x7c
CreateTime,0x80
ExitTime,0x88
LockOwner,0x90
UniqueProcessId,0x94
ActiveProcessLinks,0x98
QuotaPeakPoolUsage[0],0xa0
QuotaPoolUsage[0],0xa8
PagefileUsage,0xb0
CommitCharge,0xb4
PeakPagefileUsage,0xb8
PeakVirtualSize,0xbc
VirtualSize,0xc0
Vm,0xc8
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
8
LastProtoPteFault,0xf8
DebugPort,0xfc
ExceptionPort,0x100
ObjectTable,0x104
Token,0x108
WorkingSetLock,0x10c
WorkingSetPage,0x12c
ProcessOutswapEnabled,0x130
ProcessOutswapped,0x131
AddressSpaceInitialized,0x132
AddressSpaceDeleted,0x133
AddressCreationLock,0x134
ForkInProgress,0x158
VmOperation,0x15c
VmOperationEvent,0x160
PageDirectoryPte,0x164
LastFaultCount,0x168
VadRoot,0x170
VadHint,0x174
CloneRoot,0x178
NumberOfPrivatePages,0x17c
NumberOfLockedPages,0x180
ForkWasSuccessful,0x15e
ExitProcessCalled,0x186
CreateProcessReported,0x187
SectionHandle,0x188
Peb,0x18c
SectionBaseAddress,0x190
QuotaBlock,0x194
LastThreadExitStatus,0x198
WorkingSetWatch,0x19c
InheritedFromUniqueProcessId,0x1a4
GrantedAccess,0x1a8
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
9
kd> !process 0
PROCESS 80147120 Cid,0000 Peb,00000000 ParentCid,0000
DirBase,00030000 ObjectTable,80731e88 TableSize,254.
Image,Idle
VadRoot 0 Clone 0 Private 0,Modified 0,Locked 0.
801472DC MutantState Locked OwningThread 0
Process Lock Owned by Thread 0
Token e1000750
ElapsedTime 7:41:18.0524
UserTime 0:00:00.0000
KernelTime 9:34:32.0780
QuotaPoolUsage[PagedPool] 0
QuotaPoolUsage[NonPagedPool] 0
Working Set Sizes (now,min,max) (4,50,450) (16KB,200KB,1800KB)
PeakWorkingSetSize 4
VirtualSize 0 Mb
PeakVirtualSize 0 Mb
PageFaultCount 1
MemoryPriority BACKGROUND
BasePriority 0
CommitCharge 0
THREAD 80147320 Cid 0.0 Teb,00000000 Win32Thread,00000000 RUNNING
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
10
内存管理
组成部分
地址空间的布局
地址转换机制
内存分配方式
缺页处理
工作集
物理内存管理
其他内存相关机制
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
11
组成部分
一组执行体系统服务程序,用于虚拟内存的分配,回收和管理 。 大多数这些服务都是通过 Win32 API 或内核态的设备驱动程序接口形式出现 。
一个转换无效和访问错误陷阱处理程序用于解决硬件监测到的内存管理异常,
并代表进程将虚拟页面装入内存 。
六个的关键组件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
12
工作集管理器 ( 16优先 ):当空闲内存低于某一界限时,便启动所有的内存管理策略,如:工作集的修整,老化和已修改页面的写入等 。
进程 /堆栈交换程序 ( 23优先 ),完成进程和内核线程堆栈的换入和换出操作 。
已修改页面写入器 ( 17优先 ),将修改链表上的,脏,页写回到适当的页文件 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
13
映射页面写入器 ( 17优先 ),将映射文件中脏页写回磁盘 。
废弃段线程 ( 18优先 ),负责系统高速缓存和页面文件的扩大和缩小 。
零页线程 ( 0优先 ),将空闲链表中的页面清零 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
14
内存布局应用程序代码全程变量每个线程堆栈
DLL代码 3GB用户空间
1GB系统空间
7FFFFFFF
80000000 内核和执行体
HAL
引导驱动程序
C0000000 进程页表 BFFFFFFF
超空间
C0000000
C0800000 系统高速缓存分页缓冲池未分页缓冲池
FFFFFFFF FFFFFFFF
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
15
系统代码 (Ntoskrnl,HAL) 和一些系统中初始的未分页缓冲池系统映射视图(例如,Win32k.sys)或者会话空间超空间和进程工作集列表进程的页表和页目录附加的系统 PTE(高速缓存可以扩展到这)
没有使用,不可访问
HAL使用故障转储信息未分页缓冲池扩充系统 PTE
分页缓冲池系统高速缓存系统工作集列表
80000000
C0800000
C0400000
C0000000
A4000000
A0000000
FFBE0000
EB000000(min)
E1000000
C1000000
C0C00000
FFC00000
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
16
系统代码 包括操作系统映像,HAL和用于引导系统的设备驱动程序 。
系统映射视图 用来映射 Win32子系统可加载的核心态部分 Win32k.sys,以及它使用的核心态图形驱动程序。
会话空间 用来映射一个用户的会话信息。
进程页表和页目录 描述虚拟地址映射的结构。
超空间 一个特殊的区域用来映射进程工作集链表,并为创建临时映射物理页面。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
17
系统工作集链表 描述系统工作集的工作集链表数据结构。
系统高速缓存 用来映射在系统高速缓存中打开的文件的虚拟空间。
分页缓冲池 可分页系统内存堆。
系统页表项 系统 PTE缓冲池,用来映射系统页面。
非分页缓冲池 不可分页的系统内存堆。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
18
地址变换过程核心进程页目录索引 页表索引 字节索引
CR3 物理地址
Index
PFN
PDE
页目录
( 每个进程建立一张,1024项 )
Index
PFN
PTE
页表
( 每个进程最多有 512个,系统空间最多占用 512
个,每张表 1024项 )
Index
物理地址空间要求的字节要求的页
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
19
进程
.
.
.
.
.
.
.
.
.
进程 1
的页表进程 2
的页表
PTE 0
进程 1的页目录进程 2的页目录
PTE 0
PDE 0 PDE 0
System PTE 0
PDE 511
PDE 512
PDE n PDE n
PDE 512
PDE 511
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
System PTE n
.
.
.
系统页表进程仍然没有访问系统页表各进程私有
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
20
快表 TLB
.
.
.
虚页 5 页框 290
虚页 64 无效虚页 17 页框 1004
虚页 65 页框 801
虚页 6 页框 14
虚页 7 无效
TLB
虚页号,17
虚拟地址同时读取并比较匹配
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
21
内存分配方式
以页单位的虚拟内存函数( Virtualxxx),
– 保留与提交
内存映射文件函数( CreateFileMapping,
MapViewOfFile),
堆函数( Heapxxx 和早期的接口
Localxxx 和 Globalxxx)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
22
虚拟地址描述符范围,20000000到 2000FFFF
保护限制:读 /写继承:有范围,00002000到 0000FFFF
保护限制:只读继承:无范围,4E000000到 4F000000
保护限制:复制可写入继承:有范围,32000000到 3300FFFF
保护限制:只读继承:无范围,7AAA0000到 7AAA00FF
保护限制:读 /写继承:无
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
23
内存映射文件
加载和执行,exe和 dll文件,这可以节省应用程序启动所需的时间;
访问磁盘上的数据文件,这可以减少文件 I/O,并且不必对文件进行缓存;
实现多个进程间的数据共享 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
24
区域对象 (section object)
区域创建区域打开区域扩展区域映射 /非映射视图查询区域最大规模页保护限制页文件 /映射文件基准的 /非基准的对象类型对象体属性服务程序
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
25
文件对象虚拟地址描述符数据区控制区域子区段原型页表项页框号数据库项文件对象区域对象页目录 页表映像区控制区域 ( 如果文件是一个执行的映像 )
区域对象指针下个子区
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
26
建立过程
打开文件,区域对象可以连接到已打开的磁盘文件
(映射文件),或是已提交的内存(提供共享内存)。
可以调用 Win32函数 CreateFileMapping创建区域对象,
其参数包括映射到区域对象的文件句柄(或是
INVALID_HANDLE_VALUE表示页文件支持区域)。
如果区域有名字,其它进程可以用 OpenFileMapping
打开它。
设备驱动程序也可以使用 ZwOpenSection,
ZwMapViewOfSection,和 ZwUnmapViewOfSection函数操纵区域对象。
MapViewOfFile函数映射区域对象的一部分,并指定映射范围。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
27
堆函数
缺省进程堆,通常是 1MB大小
HeapCreate函数创建另外的私有堆,
HeapDestroy删除。
串行化选项。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
28
系统内存分配
非分页缓冲池 由系统虚拟地址组成,它们长期驻留在物理内存中,在任何时候都可以被访问到(从任何 IRQL级和任何进程上下文),而不会发生页错误。
需要未分页缓冲池的一个原因是:页错误不能满足在
DPC/调度级或更高。
分页缓冲池 是系统可以被分页和分出系统的空间中虚拟内存的一个区域。不必从 DPC/调度级或更高一级访问内存的设备驱动程序可以使用分页缓冲池。它从任何进程上下文都是可访问的。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
29
系统有两种非分页缓冲池:一种在一般情况下使用,另一种小型的( 4页)缓冲池在非分页缓冲池已满并且调用者不能允许分配失败时,紧急使用。
单处理机系统有三个分页缓冲池;多处理机系统有五个。
后备链表 (Look-Aside Lists)。
Ex…
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
30
缺页处理
无效的页表项
– 页文件
– 请求零页
– 转换
– 未知
原型页表项
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
31
PFN
页目录原型页表 物理存储器页表有效 -PFN n
无效 -指向原型 PTE
段结构有效 -PFN 5
无效 -在页文件中
PFN n
PFN n
页帧号数据库项
PTE地址共享数量 =1
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
32
页面调入 I/O
向文件(页或映射文件)发出读操作来解决缺页问题
同步的
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
33
问题
同一进程中的另一线程,或一个其它的进程,
都可能由于一个相同的页面导致缺页错误 。
( 称为,冲突页错误,,将在下节中介绍 ) 。
页面可能已经从虚拟地址空间中被删除 ( 并重新映射 ) 。
页面的保护限制可能发生了变化 。
错误可能是由一个原型页表项引发的,并且这个原型页表项所映射的页面可能并不在工作集中 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
34
冲突页错误 (collided page fault)
页面调度程序检测
等待操作
I/O操作完成后,所有等待该事件的线程都会被唤醒
第一个获得页框号数据库锁的线程负责执行页面调入完成操作。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
35
页文件
最多 16个页文件
以非压缩的形式被创建
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
36
工作集
进程工作集
系统工作集
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
37
系统工作集
系统高速缓存页面
分页缓冲池
Ntoskrnl.exe中可分页的代码和数据
设备驱动程序中可分页的代码和数据
系统映射视图 ( 部分映射在 0xA0000000
处,如 Win32k.sys)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
38
取页策略:内存管理器利用请求式页面调度算法以及簇方式将页面装入内存
臵页策略:选择页框应使 CPU内存高速缓存不必要的震荡最小
换页策略
– 在多处理器系统中,Windows 2000/XP采用了局部先进先出臵换策略。而在单处理器系统中,Windows 2000/XP的实现更接近于最近最少使用策略( LRU) (称为“轮转算法”,用于大多数版本的 UNIX)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
39
物理内存管理
活动 ( 又称有效 )
过渡 (Transition)
后备 (stand by)
修改
修改不写入
空闲
零初始化 (zeroed)
坏
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
40
进程 1的页表进程 3的页表页框号数据库有效无效:磁盘地址无效:迁移
...
进程 2的页表有效无效:磁盘地址有效
...
...
有效无效:迁移无效:磁盘地址使用中后备链表使用中使用中修改链表
...
原型页表项前向指针后向指针
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
41
物理内存管理零初始化当前页框号数据库
■
当前当前
■
■
■
...
空闲后备坏修改修改不写入
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
42
进程工作集后备页链表修改页面写回程序修改页链表空闲页链表零初始化页面线程零初始化页链表 坏页链表,软,缺页故障工作集重置从外存或内核配置读入的页面需求零缺页故障
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
43
锁内存
设备驱动程序可以调用核心态函数
MmProbeAndLockPages,MmLock
PagableCodeSection,
MmLockPagableDataSection,或者
MmLockPagableSection ByHandle。
Win32应用程序可以调用 VirtualLock函数锁住进程工作集中的页面。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
44
内存保护机制
所有系统范围内核心态组件使用的数据结构和内存缓冲池只能在核心态下访问。
每个进程有一个独立、私有的地址空间,
禁止其它进程的线程访问。
支持的处理机还提供了一些硬件内存保护措施(如读 /写,只读等)。
共享内存区域对象具有标准的
Windows2000/XP存取控制表( ACLs)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
45
写时复制进程地址空间原始数据进程地址空间原始数据页3
页2
页1
物理内存页3
页2
页1
物理内存进程地址空间原始数据页2 的拷贝进程地址空间修改的数据
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
46
物理地址扩展
KPROCESS
页目录指针索引 页表索引页内字节偏移
CR3 物理地址
Index
页目录
( 每进程最多四张,每张 512项,
8字节宽 )
Index
PFN
PTE
页表
( 每张 512项,
8字节宽 )
Index
物理地址空间要求的字节要求的页页目录索引
PDE
PFN
Index
PFN
PDE
Index
页目录指针
( 每进程一个,4项 )
31 29 20 11
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
47
地址窗口扩充物理内存
AWE 窗口
4GB
0
2GB
64GB
服务器程序地址空间系统地址空间用户地址空间
AWE内存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
48
外存管理
Windows 2000/XP存储的演变
分区( Partitioning)
驱动程序 (Drivers)
多重分区管理 (Multipartition Volume
Management)
卷名字空间 (The Volume Namespace)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
49
存储的演变
让 MS— DOS在一个物理盘上采用多个分区,
也就是逻辑盘
Windows NT借鉴了 MS— DOS的分区机制,
扩展了 MS— DOS分区的基本概念,支持企业级操作系统所需的一些存储管理的特征:跨磁盘管理( disk spanning)和容错( fault tolerance)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
50
早期磁盘管理的缺点
对大多数磁盘设置的改变需要重启操作系统才能生效
NT的注册表中为 MS— DOS方式的分区保存了多分区磁盘的配置信息
每个卷有一个唯一的从 A到 Z的驱动器名
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
51
盘一种物理存储设备。
扇区可寻址的大小固定的块。
分区是盘上连续扇区的集合。
简单卷代表文件系统驱动程序作为一个独立单元管理来自一个分区的所有扇区。
多分区卷它代表文件系统驱动程序作为一个独立单元管理来自多个分区的所有扇区。多分区卷提供简单卷所不支持的性能、可靠性和大小等特性。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
52
分区
基本分区
动态分区
– 逻辑磁盘管理子系统 (LDM)负责
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
53
LDM
LDM的数据库存在于每个动态盘最后的 1MB
保留空间中。
LDM实现了一个 MS DOS的分区表,这是为了继承一些在 Windows2000/XP下运行的磁盘管理工具,或是在双引导环境中让其它系统不至于认为动态盘还没有被分区。
由于 LDM分区在磁盘的 MS DOS分区表中并没有体现出来,所以被称为软分区,而 MS DOS
分区被称为硬分区。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
54
主引导记录
1MB
LDM数据库LDM分区区域动态盘的内部组织
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
55
内容表 处理日志数据库记录
1MB
私有头镜像数据库记录头私有头
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
56
数据库结构
私有头,GUID,磁盘组的名字 ( 该名字是由 Dg0和计算机的名字一起组成,例如 SusanDg0,意味着计算机的名字是 Susan) 和一个指向数据库内容表的指针 。 为了保证可靠性,LDM在磁盘的最后一个扇区保存了私有头的拷贝 。
数据库内容表有 16个扇区大小,其中包含关于数据库布局的信息 。
数据库记录区域紧接着内容表,并将内容表后第一个扇区作为数据库记录头 。 这个扇区中存储了数据库记录区的信息,包括其所包含的记录个数,数据库相关的磁盘组的名字和 GUID,以及 LDM用于创建下一项的序列号 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
57
数据库中的每一项可以是如下四种类型之一:分区,
磁盘,组件,卷 。 LDM把每一项与内部对象的标识符联系到一起 。 在最低的级别,分区项描述软分区,它是在一个盘上的连续区域 。 存储在分区项中的标识符把这个项与一个组件和一个磁盘项联系起来 。 磁盘项代表一个磁盘组中的动态盘,包括磁盘的 GUID。 组件项像一条链子把一个或多个分区项和与分区相连的卷项联系起来 。 卷项存放这个卷的 GUID,卷的大小和状态,
驱动器的名字 。 比一个数据库记录大的磁盘项占用多个记录的空间,分区项,组件项和卷项很少占用多个记录的空间 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
58
LDM需要三个项来描述一个简单卷:分区项,组件项和卷项 。 分区项描述系统分配给某个卷的磁盘上的一个区域,组件项把一个分区项和一个卷项联系起来,卷项中包含 Windows 2000/XP内部用来识别卷的 GUID。 多分区卷需要的项数多于三个 。 例如,一个条带卷包括最少两个分区项,一个组件项和一个卷项 。 唯一一种含有一个以上组件项的卷的类型是:镜像卷 。 镜像卷含有两个组件项,每个只表示这个镜像的一半 。 LDM为每个镜像卷使用两个组件项的目的是:当一个镜像破坏时 LDM能够在组件一级将他们分割开来,并创建两个各含有一个组件项的卷 。 因为简单卷需要三个项,而
1MB数据库空间大约可以容纳 8000个项,所以在
Windows 2000/XP中可以创建的卷数目的有效上界大约是 2500个 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
59
LDM数据库的最后部分是事务处理日志区,
它包含的几个扇区在数据库信息改变时用来存储备份信息。这样确保在系统崩溃或断电时,LDM能够利用日志把系统恢复到一个正确的状态。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
60
驱动程序
系统卷中引导扇区中的代码负责执行 Ntldr。
Ntldr从系统卷中读取 Boot.ini文件,把计算机的引导选项显示给用户。 Boot.ini指定分区名为 mult(0)disk(0)rdisk(0)partition(1)
的形式。
Ntldr把 Boot.ini中用户指定的项转换为正确的引导分区,然后将 Windows 2000/XP系统文件(从注册表,Ntoskrnl.exe、引导驱动程序开始)装入内存,继续引导过程。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
61
Windows 2000/XP的存储驱动程序
– 类:实现所有存储设备共同的功能
– 端口:基于某种特定总线设备的共同功能,如 SCSI、
IDE
– 小端口,OEM提供
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
62
磁盘的类驱动程序使用 I/O管理器的
IoReadPartitionTable函数识别表示分区的设备对象
设备名
– \Device\Harddisk0\DP(1)0x7e000-
0x7ff50c00+2
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
63
Windows 2000/XP保存了两个不同的名字空间子目录供
Win32使用,其中之一是,\子目录 ( 另一个是
\BaseNamedObjects 子目录 ) 。
在 \子目录中,Windows 2000/XP创建了一些与 Win32
程序交互的硬件对象,包括串口和并口,还有磁盘 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
64
由于磁盘对象实际上存在于其它的子目录中,所以
Windows 2000/XP使用符号链接,把在 \子目录下的名字与在名字空间其它地方的对象联系起来 。 I/O管理器 为 系 统 中 的 每 一 个 物 理 盘 都 创 建 一 个
\\PhysicalDriveX 的 链 接,指向
\Device\HarddiskX\Partition0( 从零开始的数字来替代 X) 。
那些直接访问磁盘扇区的 WIN 32应用程序可以调用
Win32 函数 CreateFile,通过指定 \\.\PhysicalDriveX
( X是一个磁盘的号码 ) 作为参数来打开磁盘 。 Win32
的应用层先把名字转化为 \\PhysicalDriveX,然后在把名字提交给 Windows2000/XP对象管理器 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
65
管理 工具
FtDisk和 DMIO负责识别文件系统驱动程序管理的卷,并将 I/O直接从卷映射到组成卷的底层分区 。
对简单卷来说,通过把卷的偏移量加上卷在磁盘中的起始地址,卷管理器可以保证卷的偏移量被转换成盘的偏移量 。
对于多分区卷这就复杂多了,因为组成卷的分区可以是不邻接的分区,甚至可以在不同的磁盘中。有一些多分区卷使用数据冗余技术,所以它们需要更多的卷到磁盘的转换工作。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
66
多重分区管理
跨分区卷 (spanned volume)
条带卷( striped volume)
镜像卷( mirrored volume)
廉价冗余磁盘阵列 5卷( RAID-5 volume)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
67
跨分区卷
C:
100MB
E:
100MB
NTFS
VOLUME1
NTFS
VOLUME2
NTFS
VOLUME 2
NTFS
VOLUME 3
D:
50MB
D:
50MB
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
68
一个单独的逻辑卷,最多由在一个或多个磁盘上的 32个空闲分区组成。
跨分区卷可以用来把小的磁盘空闲区域,
或者把两个或更多的小磁盘组成大的卷。
卷管理器对 Windows 2000/XP的文件系统隐藏了磁盘物理配臵信息。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
69
条带卷( RAID-0卷)
150MB150MB150MB
条1
7
6
5
4
3
2
1
7
6
5
4
3
2
150MB150MB150MB
0 9
8
654321
23
22
2019181716
15
131211107 14
24
21
...25
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
70
一系列分区组成的单独的逻辑卷,最多有 32个分区并且每个盘一个分区。
条带卷中的一个分区不需要占据整个磁盘,唯一的限制是每个盘上的分区大小相同
数据能够被平均分配到每个磁盘上
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
71
镜像卷
c:
c:
(mirror)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
72
一个磁盘上分区的内容被复制另一个磁盘与它等大小的分区中。镜像卷有时也被称为 RAID-
1。
镜像卷能够可以在主分区和镜像分区之间平衡
I/O操作 。 两个读操作可以同时进行,所以理论上只用一半时间就可以完成 。 当修改一个文件时,必须写入镜像卷的两个分区,但是磁盘写操作可以异步进行,所以用户态程序的性能一般不会被这种额外的磁盘更新所影响 。
镜像卷是唯一一种支持系统卷和引导卷的多分区卷。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
73
廉价冗余磁盘阵列 5卷条1
7
6
5
4
3
2
1
7
6
5
4
3
2
奇偶校验磁盘1 磁盘2 磁盘3
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
74
卷名字空间
安装管理器
安装点
卷安装
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
75
安装管理器
安装管理器( Mountmgr.sys)是 Windows
2000/XP中新驱动程序,为在 Window 2000/XP
安装后创建的动态磁盘卷和基本磁盘卷分配驱动器名。
卷管理器创建卷时都将通知它。当接到通知时,
确定新的卷 GUID或者磁盘标记;
安装管理器使用卷 GUID(或者标识)在内部数据库中进行查询
安装管理者使用第一个未分配的驱动器名,为这次分配创建一个符号链接(例如,\\D:)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
76
安装点
实现安装点的技术是再解析点 (Reparse
Point)技术。
C:\Project
CurrentProject\Description.txt
C:\Projects\CurrentProject\Description.t
xt
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
77
卷安装
每个文件系统驱动程序在初始化时都向
I/O管理器注册
每个设备对象包含一个卷参数块 VPB,
但是 I/O管理器认为只有卷设备对象的
VPB是有意义的
安装请求
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
78
安装管理器把 D:分配给系统中的第二个卷
它产生符号连接 \\D:指向设备对象
\Device\HarddiskVolume2。
一个 WIN 32应用程序试图打开 D:上的文件 \Temp\Test.txt时,它将会指定路径 D,
\Temp\Test.txt。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
79
WIN 32子系统在调用 NtCreateFile之前将路径转化为 \\D,\Temp\Test.txt。
I/O管理器将检查
\Device\HarddiskVolume2的 VPB是否引用一个文件系统。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
80
高速缓存
单一集中式系统高速缓存
– 任何数据都能被高速缓存,无论它是用户数据流 ( 文件内容和在这个文件上正在进行读和写的活动 ) 或是文件系统的元数据
( metadata) ( 例如目录和文件头 )
与内存管理器结合
– 因为它采用将文件视图映射到系统虚拟空间的方法访问数据
高速缓存的一致性
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
81
用户地址空间视图1
视图2
系统地址空间进程1虚拟内存视图2
系统地址空间进程2虚拟内存用户地址空间
4GB
系统缓存
2GB
0
映射文件
4GB
系统缓存
2GB
0
控制区域物理内存
SIZE
0
文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
82
虚拟块缓存
– Windows 2000/XP高速缓速管理器用一种虚拟块缓存方式,管理器对缓存中文件的某些部分进行追踪 。 通过内存管理器的特殊系统高速缓存例程将 256-KB大小的文件视图映射到系统虚拟地址空间,高速缓存管理器能够管理文件的这些部分 。 这种方式有以下几个主要特点:
– 它使智能的文件预读成为可能 。
– 它允许 I/O系统绕开文件系统访问已经在缓存中的数据(快速 I/O)。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
83
基于流的缓存
可恢复的文件系统支持
– 文件系统写一个日志文件记录,记录将要进行的卷修改操作 。
– 文件系统调用高速缓存管理器将日志文件记录刷新到磁盘上。
– 文件系统把卷修改内容写入高速缓存,即修改文件系统在高速缓存的元数据。
– 高速缓存管理器将被更改的元数据刷新到磁盘上,更新卷结构。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
84
系统代码 (Ntoskrnl,HAL) 和一些系统中初始的未分页缓冲池系统映射视图(例如,Win32k.sys)或者会话空间超空间和进程工作集列表进程的页表和页目录附加的系统 PTE(高速缓存可以扩展到这)
没有使用,不可访问
HAL使用故障转储信息未分页缓冲池扩充系统 PTE
分页缓冲池系统高速缓存系统工作集列表
80000000
C0800000
C0400000
C0000000
A4000000
A0000000
FFBE0000
EB000000(min)
E1000000
C1000000
C0C00000
FFC00000
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
85
视图 0
视图 1
视图 2
视图 3
视图 4
视图 5
视图 6
视图 7
视图 08
视图 n
系统高速缓存节 0
节 1
文件 A(500KB)
节 0
节 1
文件 B(750KB)
节 2
节 0
文件 C(100KB)
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
86
高速缓存的大小
缓存区的虚拟大小
缓存的物理大小
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
87
高速缓存的数据结构
在系统高速缓存的每个 256 KB的槽由一个 VACB描述 。
每个打开的被缓存文件有一个专用的缓存映射,它包含了用于控制文件预读的信息 。
每个被缓存的文件有一个单独的共享缓存映射结构,它指向系统缓存中包含此文件映射视图的槽 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
88
虚拟地址控制块 ( VACB)
系统高速缓存中数据的虚拟地址
指向共享高速缓存映射的指针
文件偏移
活动计数
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
89
VACB 0
VACB 7
VACB 6
VACB 5
VACB 4
VACB 3
VACB 2
VACB 1
VACB n
View 1
View n
View 8
View 7
View 6
View 5
View 4
View 3
View 0
View 2
系 统 V A C B 数 组系统缓存
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
90
文件 A(500 KB)
节 0
节 1
文件 B(750 KB)
节 0
节 1
节 2
文件 C(100 KB)
节 0
文件 A的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
文件 B的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
文件 C的 VACB
指针数组入口 0
入口 1
入口 2
入口 3
系统 VACB数组
VACB 0
VACB 1
VACB 2
VACB 3
VACB 4
VACB 5
VACB 6
VACB 7
VACB n
系统高速缓存视图 0
视图 1
视图 2
视图 3
视图 4
视图 5
视图 6
视图 7
视图 8
视图 n
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
91
共享的 高速缓存映射
VACB数组
VACB
VACB
VACB
0
0
0
0
0
0
127
127
127
127
127
127
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
92
高速缓存的操作
回写缓存和延迟写
写入文件的数据首先被存储在高速缓存页面的内存中,然后再被写入磁盘。因此,写操作允许在短时间内积累,并一次性刷新到磁盘,这可以减少磁盘的 I/O次数。
屏蔽对文件延迟写
– 在调用 Win32 CreateFile函数时指定
FILE_ATTRIBUTE_TEMPORARY标志创建一个临时文件,延迟写器就不会将脏页写回磁盘,除非物理内存严重不足或文件关闭。
强制写缓存到磁盘
刷新被映射的文件
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
93
智能预读
虚拟地址预读
– 将被访问页面相近的几个页一起读到内存中 。 内存管理器的这种方法唯一缺点是:必须同步进行
带历史信息的异步预读
– 高速缓存管理器在文件的私有缓存映射结构中为正在被访问的文件句柄保存最后两次读请求的历史信息
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
94
快速 I/O(fast I/O)
写阻塞
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
95
访问缓存数据的方法
,拷贝读取,方法在系统空间中的高速缓存数据缓冲区和用户空间中的进程数据缓冲区之间拷贝用户数据;
,映射暂留,方法使用虚拟地址直接读写高速缓存的数据缓冲区 。
,物理内存访问,方法使用物理地址直接读写高速缓存的数据缓冲区 。
Mi
cr
os
of
t?
W
indow
s
2
00
0/X
P
96