windows游戏编程X86 32位保护模式下的内存管理概述(二)

本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22448323

作者:jadeshu   邮箱: jadeshu@qq.com    欢迎邮件交流


Windows在其内核(ntoskrnl.exe/ntkrnlpa.exe/ntkrnlmp.exe/ntkrpamp.exe)中实现内存管理器
•Windows内存管理器只利用两种保护级别的页面:RING0(内核和驱动使用)RING3(外壳和一般应用程序使用)
•Windows只利用了5个段选择子寄存器:SS、CS、DS、ES、FS,而GS未用永远为0x0000
•Windows内存管理使用了Flat(平坦)模式,所有起始地址都为0x00000000
•在X86架构系统上Windows默认页面大小与CPU定义一致为4K大小
•而分配地址空间(不是实际分配物理内存)大小最小粒度为64k
•Windows利用X86的段存在标志P实现了虚拟内存支持,在硬盘上会创建称为页面文件(pagefile.sys)的虚拟内存文件
•Windows为每个进程都提供了平坦的4GB的虚拟空间
•部分高级的Windows版本支持PAE

•工作集(Working Set):进程虚拟空间中实际被映射到物理内存页面的那部分被称为工作集;
•当进程想访问多余实际物理内存的内存时,系统会启用虚拟内存管理机制(工作集管理),将那些长时间未访问的物理页面复制到硬盘缓冲文件上,并释放这些物理页面,映射到虚拟空间的其它页面上;
•内存管理器由下列组件构成(分别运行于独立的线程):
–工作集管理器(优先级16);
–进程/栈交换器(优先级23);
–已修改页面写出器(优先级17);
–映射页面写出器(优先级17);
–解引用段线程(优先级18);
–零页面线程(优先级0);

1.工作集管理器
•工作集管理器被一个称作“平衡集管理器”(名为KeBahnceSetManager)的系统线程环境调用
•平衡集管理器(内核线程之一)至少每秒调用工作集管理器一次,若系统空闲内存数量过低(低于某个阀值时)也会调用工作集管理器;
•工作集管理器总控内存管理策略,比如:工作集修剪、页面年龄(aging)、以及写出已修改页面等;
•在Windows 2000以上系统中工作集分为3类:进程工作集、系统工作集、会话工作集;

2.进程/栈交换器
•执行进程栈和内核线程栈环境(CONTEXT)的交换工作(线程调度)
•当需要进行栈环境交换时,平衡集管理器就唤醒(Resume)此线程

3.已修改页面写出器
•将物理内存中的已被修改过的页面写回硬盘上的页面文件中
•当已修改页面列表中的页面数量超过某一阀值时,此线程被唤醒

4.映射页面写出器
•将内存映射文件中的已修改页面写回到磁盘对应的文件上
•当修改列表中页面数量大于某个阀值或者修改列表上的页面持续5分钟以上未写回磁盘时,该线程被唤醒执行

5.解引用段线程
•负责页面缓存的回收,以及管理页面文件的增长和缩减
•当可用的映射物理内存变少时,该线程被唤醒释放一些页面缓存用于映射

6.零页面线程
•将空闲的页面清成0,用于下一次使用

进程虚拟地址空间的布局结构
•Windows系统为每个进程准备了独立的虚拟地址空间
•在32位Windows上这个地址空间总大小为4GB
•Windows能支持的最大物理内存范围从2GB-1024GB大小,不同版本(不同的CPU)支持实际大小不同
•进程的虚拟地址空间通常被分为两大部分:用户方式分区和内核分区
•在Win32上每个地址空间的开始地址都是0x00000000,最大地址是0xFFFFFFFF
•一般情况下Win32中用户分区和内核分区的界限是0x7FFFFFFF-0x80000000
•Win32 中 0x7FFFFFFF以下为用户区
•在64位(x64)上用户分区为8192GB,在IA-64上用户分区为7152GB
•一般进程代码仅能访问用户分区中的地址范围

用户分区分布情况


内核分区详细情况



注:本篇GameBaby引用
posted @ 2014-03-29 00:07  jadeshu  阅读(144)  评论(0编辑  收藏  举报