本系列文章由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. Abandoning Roads CodeForces - 1149D (最小生成树)

    大意: 给定无向图, 边权只有两种, 对于每个点$x$, 输出所有最小生成树中, 点$1$到$x$的最短距离. 先将边权为$a$的边合并, 考虑添加边权为$b$的边. 每条路径只能经过每个连通块一次, ...

  2. Unity中的Character Controller

    Unity中默认提供了一个Character Controller的组件用于实现角色控制,一个3D的游戏物体,可以直接添加.Character Controller会自动模拟出Capsule Coll ...

  3. (十八)SpringBoot之发送QQ邮件

    一.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  4. (九)SpringBoot之错误处理

    一.错误处理方法 1.Spring Boot 将所有的错误默认映射到/error, 实现ErrorController 2.添加自定义的错误页面   二.Spring Boot 将所有的错误默认映射到 ...

  5. (九)springmvc之json的数据请求(客户端发送json数据到服务端)

    index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...

  6. JavaBean 详细

    一.什么是JavaBean? JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方 ...

  7. SQL alchemy

    SQL alchemy介绍 SQL alchemy是orm思想的一个具体实现的产品 orm:对象关系映射思想 Object Relational Mapping 就是将数据库里的资源与面向对象中的类和 ...

  8. Java 之 泛型

    一.泛型概述 集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成 Object 类型.当我们取出一个对象,并且进行相应的操作,这时必须采用类型转换. 先观察下面代码: publ ...

  9. elementUI .native修饰符

    用第三方组件或者UI框架会自带自身封装的事件,如keyup等,会覆盖原生的组件而无法起效果 .native 修饰符就是用来注册元素的原生事件而不是组件自定义事件的 如elementUI的:<el ...

  10. SAP官方发布的ABAP编程规范

    最近有朋友在公众号后台给我留言,"Jerry啊,你最近写的都是一些SAP研究院里面用到的新技术,能不能写点SAP传统的开发技术比如ABAP相关的东西"? 其实Jerry在刚开始写这 ...