本系列文章由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引用

windows游戏编程X86 32位保护模式下的内存管理概述(二)的更多相关文章

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

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22445945 作者:jadeshu   邮箱: jades ...

  2. windows游戏编程X86实模式和保护模式

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22309359 作者:jadeshu   邮箱: jades ...

  3. windows游戏编程X86 (内存)寄存器相关的基本概念

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22446971 作者:jadeshu   邮箱: jades ...

  4. x86架构:保护模式下利用中断实现抢占式多任务运行

         站在用户角度考虑,一个合格的操作系统即使在单核下也能 "同时" 执行多个任务,这就要求CPU以非常快的频率在不同任务之间切换,让普通人根本感觉不到任务的切换.windwo ...

  5. x86架构:保护模式下加载并运行用户程序

    本章的代码分3个模块: MBR 引导:加载内核core程序 core:包含内核代码段(从磁盘加载用户程序并重定位).内核数据段(存放api名称.临时缓冲.字符串等).API段(供用户程序调用) 用户程 ...

  6. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  7. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  8. 《Windows核心编程》第八章——用户模式下的线程同步

    下面起了两个线程,每个对一个全局变量加500次,不假思索进行回答,会认为最后这个全局变量的值会是1000,然而事实并不是这样: #include<iostream> #include &l ...

  9. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

随机推荐

  1. hdu 1203 转换的01包问题。。。。

    俗话说的话 正难则反.,.  这个基本的思想都用不好的话 回家种田去吧. #include<cstdio> #include<string.h> #include<ios ...

  2. (十九)SpringBoot之使用Spring Session集群-redis

    一.引入maven依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnc ...

  3. 奇妙的算法【7】-贪婪算法-dp

    问题1描述:[贪婪算法,Dijistra算法] ①有一只兔子要从一个N*N的二维矩阵方格中从上跳到下面: ②每次只能向左或向下,越过一个方格,跳到下一个方格中: ③被越过的方格中的数值,表示该兔子越过 ...

  4. Senparc.Weixin+nginx配置之坑 ‘10003 redirect_uri域名与后台不一致’

    微信公众号扫一扫功能提示:10003 redirect_uri域名与后台不一致 Senparc.Weixin组件很好用,但一个坑,不知道这和个是否有关.. 先说明下环境,centos+.net cor ...

  5. menustrip选项怎么设置竖向分割线

    效果图: 解决方案: 选中一个项--[右键]--[插入]--[separator]

  6. Mybatis在xml文件中处理大于、小于、不等于号的方法

    在mapper.xml使用大于.小于等符号会和xml语法冲突,解决冲突有两种方式. 方法一: 使用转义字符: 字符名称 字符符号 转义字符 大于号 > > 小于号 < < 与 ...

  7. 用js刷剑指offer(重建二叉树)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  8. ArrayList 和 LinkedList 的区别是什么?(未完成)

    ArrayList 和 LinkedList 的区别是什么?(未完成)

  9. SEO 统计算法

    1)简单粗暴型的,这里不用去管浏览器的user-agent,不管cookie等信息,每产生一次PV,就直接计数,优点:简单,缺点:可能不真实,也可能有刷量数据 2) 稍微细腻点的统计,会区分新老用户, ...

  10. 启动nginx 80端口被占用:tcp 0 0 127.0.0.1:80 127.0.0.1:34932 TIME_WAIT -

    1.启动nginx命令./sbin/nginx 2.提示80端口被占用 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already ...