Windows内存管理学习笔记(二)—— 物理内存的管理

  • 物理内存
    • 实验一:理解MmNumberOfPhysicalPages
  • MmPfnDatabase
    • _MMPFN
      • 物理页状态
      • 六个链表
    • 实验二:理解零化链表
    • 实验三:查看进程占用的所有物理页

物理内存

最大物理内存

  1. 10-10-12分页:最多识别4GB物理内存
  2. 2-9-9-12分页:最多识别64GB物理内存

操作系统限制

  1. 在xp系统中,即使采用2-9-9-12分页,仍然无法使用超过4GB的物理内存(可理解为 4GB以上的内存条)
  2. 而在windows 2003windows 2008系统中,即使为32位系统,但若采用2-9-9-12分页,就可以识别4GB以上的物理内存

思考:为什么?
答案:由内核文件中的几个函数限制

实际物理内存
物理内存总数 = MmNumberOfPhysicalPages * 4

实验一:理解MmNumberOfPhysicalPages

1)打开任务管理器,查看物理内存

2)查看MmNumberOfPhysicalPages(单位:物理页)

命令:dd MmNumberOfPhysicalPages


3)计算物理内存

结论物理内存总数 = MmNumberOfPhysicalPages * 4

思考:这么多物理内存,操作系统如何进行管理
答案:通过全局数组MmPfnDatabase

MmPfnDatabase

描述

  1. 全局结构体数组,称为“页帧数据库”,包含了当前操作系统中所有的物理页
  2. 每一个物理页都有一个对应的MMPFN结构体
  3. 通过全局变量MmPfnDatabase可以找到这个结构体的起始位置(在WinDbg中使用命令dd MmPfnDatabase进行查看)
  4. 每一个MMPFN结构体之间在内存中是紧挨着的

定义_MMPFN *MmPfnDatabase
长度MmNumberOfPhysicalPages

_MMPFN

//FROM WinDbg
nt!_MMPFN+0x000 u1               : __unnamed+0x004 PteAddress       : Ptr32 _MMPTE+0x008 u2               : __unnamed+0x00c u3               : __unnamed+0x010 OriginalPte      : _MMPTE+0x018 u4               : __unnamed
//FROM WRK v1.2
typedef struct _MMPFN {union {PFN_NUMBER Flink;WSLE_NUMBER WsIndex;PKEVENT Event;NTSTATUS ReadStatus;//// Note: NextStackPfn is actually used as SLIST_ENTRY, however// because of its alignment characteristics, using that type would// unnecessarily add padding to this structure.//SINGLE_LIST_ENTRY NextStackPfn;} u1;PMMPTE PteAddress;union {PFN_NUMBER Blink;//// ShareCount transitions are protected by the PFN lock.//ULONG_PTR ShareCount;} u2;union {//// ReferenceCount transitions are generally done with InterlockedXxxPfn// sequences, and only the 0->1 and 1->0 transitions are protected// by the PFN lock.  Note that a *VERY* intricate synchronization// scheme is being used to maximize scalability.//struct {USHORT ReferenceCount;MMPFNENTRY e1;};struct {USHORT ReferenceCount;USHORT ShortFlags;} e2;} u3;
#if defined (_WIN64)ULONG UsedPageTableEntries;
#endifunion {MMPTE OriginalPte;LONG AweReferenceCount;};union {ULONG_PTR EntireFrame;struct {#if defined (_WIN64)ULONG_PTR PteFrame: 57;
#elseULONG_PTR PteFrame: 25;
#endifULONG_PTR InPageError : 1;ULONG_PTR VerifierAllocation : 1;ULONG_PTR AweAllocation : 1;ULONG_PTR Priority : MI_PFN_PRIORITY_BITS;ULONG_PTR MustBeCached : 1;};} u4;} MMPFN, *PMMPFN;

MMPFN与物理页的对应关系

  1. 通过当前MMPFN结构体找到对应的物理页
    物理页 = 当前_MMPFN索引值*0x1000

  2. 通过当前物理页找到对应的MMPFN结构体
    _MMPFN = *MmPfnDatabase + 0x1c*(物理页/0x1000)

物理页状态

MMFPN->u3.e1定义:

//FROM WRK v1.2
typedef struct _MMPFNENTRY {USHORT Modified : 1;USHORT ReadInProgress : 1;USHORT WriteInProgress : 1;USHORT PrototypePte: 1;USHORT PageColor : 4;USHORT PageLocation : 3;       //决定了当前页的状态,空闲情况下分为六种状态//0:MmZeroedPageListHead//1:MmFreePageListHead//2:MmStandbyPageListHead//3:MmModifiedPageListHead//4:MmModifiedNoWritePageListHead//5:MmBadPageListHeadUSHORT RemovalRequested : 1;USHORT CacheAttribute : 2;USHORT Rom : 1;USHORT ParityError : 1;
} MMPFNENTRY;

六个链表

描述:windows通过六个链表,将所有相同类型的物理页串到一起

  1. MmZeroedPageListHead
    零化链表(是系统在空闲的时候进行零化的,不是程序自己清零的那种)
  2. MmFreePageListHead
    空闲链表(物理页是周转使用的,刚被释放的物理页是没有清0,系统空闲的时候有专门的线程从这个队列摘取物理页,加以清0后再挂入MmZeroedPageListHead

    MMPFNLIST MmZeroedPageListHead = {0, // TotalZeroedPageList, // ListNameMM_EMPTY_LIST, //FlinkMM_EMPTY_LIST  // Blink
    };
    

    此时,MMPFN对应结构体如下

    typedef struct _MMPFN {PFN_NUMBER Flink;PMMPTE PteAddress;PFN_NUMBER Blink;u3;MMPTE OriginalPte;u4;
    } MMPFN, *PMMPFN;
    
  3. MmStandbyPageListHead
    备用链表(当系统内存不够的时候,操作系统会把物理内存中的数据交换到硬盘上,此时页面不是直接挂到空闲链表上去,而是挂到备用链表上,虽然我释放了,但里边的内容还是有意义的)
  4. MmModifiedPageListHead
  5. MmModifiedNoWritePageListHead
  6. MmBadPageListHead
    坏链

实验二:理解零化链表

1)在WinDbg中查看全局变量MmPfnDatabase的值

2)查看全局变量MmZeroedPageListHead的值

3)定位第一个零化链表
公式MmZeroedPageList[0] = MmPfnDatabase + MmZeroedPageListHead[3]*0x1c

4)查看后四项(红色代表Flink,蓝色代表Blink)

总结:零化链表结构如下图所示

实验三:查看进程占用的所有物理页

1)在WinDbg中定位目标进程

2)查看该进程的EPROCESS结构体,定位偏移为0x1f8的成员

命令:kd> dt _EPROCESS 866bf7e8

kd> dt _EPROCESS 866bf7e8
ntdll!_EPROCESS......+0x1f8 Vm               : _MMSUPPORT......

3)查看_MMSUPPORT结构体

命令:dt _MMSUPPORT 866bf7e8+0x1f8

ntdll!_MMSUPPORT+0x000 LastTrimTime     : _LARGE_INTEGER 0x01d6e998`ed894368+0x008 Flags            : _MMSUPPORT_FLAGS+0x00c PageFaultCount   : 0xb7+0x010 PeakWorkingSetSize : 0xbd+0x014 WorkingSetSize   : 0xbd+0x018 MinimumWorkingSetSize : 0x32+0x01c MaximumWorkingSetSize : 0x159+0x020 VmWorkingSetList : 0xc0883000 _MMWSL+0x024 WorkingSetExpansionLinks : _LIST_ENTRY [ 0x864b2a9c - 0x8649323c ]+0x02c Claim            : 0+0x030 NextEstimationSlot : 0+0x034 NextAgingSlot    : 0+0x038 EstimatedAvailable : 0+0x03c GrowthSinceLastEstimate : 0xb7

4)查看VmWorkingSetList

命令:dt _MMWSL 0xc0883000

nt!_MMWSL+0x000 Quota            : 0+0x004 FirstFree        : 0x1e+0x008 FirstDynamic     : 0xa+0x00c LastEntry        : 0x217+0x010 NextSlot         : 7+0x014 Wsle             : 0xc0883cfc _MMWSLE          //物理页起始地址+0x018 LastInitializedWsle : 0x4c0                    //物理页个数+0x01c NonDirectCount   : 0x33+0x020 HashTable        : 0xc0a84000 _MMWSLE_HASH+0x024 HashTableSize    : 0x200+0x028 NumberOfCommittedPageTables : 2+0x02c HashTableStart   : 0xc0a84000 Void+0x030 HighestPermittedHashAddress : 0xc0e00000 Void+0x034 NumberOfImageWaiters : 0+0x038 VadBitMapHint    : 0x16+0x03c UsedPageTableEntries : [1536] 0x34+0xc3c CommittedPageTables : [48] 1

5)查看最后一个成员

命令:dd 0xc0883cfc L4c2

Windows内存管理学习笔记(二)—— 物理内存的管理相关推荐

  1. 研发管理学习笔记4-学习研发管理的51CTO视频课

    视频学习课程地址: https://edu.51cto.com//center/course/lesson/index?id=279539 这是一个付费课程,专门写给技术管理方面的新手看的,讲师在很多 ...

  2. DB2 UDB V8.1 管理 学习笔记

    DB2 UDB V8.1 管理 学习笔记 DB2 学习笔记 - AIview.com Last updated on Wednesday, August 24, 2005 Skip to naviga ...

  3. Windows编程课程学习笔记

    一. Windows程序内部运行机制--Windows编程课程学习笔记 二. MFC框架程序分析--Windows编程课程学习笔记 三. 简单绘图--Windows编程课程学习笔记 四. 文本编程-- ...

  4. Windows内存管理学习笔记(三)—— 无处不在的缺页异常

    Windows内存管理学习笔记(三)-- 无处不在的缺页异常 缺页异常 实验一:设置虚拟内存 无处不在的缺页 位于页面文件 保留与提交的误区 实验二:理解缺页异常 EXECUTE_WRITECOPY ...

  5. Windows内存管理学习笔记(一)—— 线性地址的管理

    Windows内存管理学习笔记(一)-- 线性地址的管理 用户空间线性地址的管理 实验一:理解用户空间线性地址管理 Private Memory 实验二:理解Private Memory 堆 实验三: ...

  6. 郝健: Linux内存管理学习笔记-第4节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 摘要 page cache free命令的详细解释 ...

  7. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  8. 郝健: Linux内存管理学习笔记-第5节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 摘要 ...

  9. 郝健: Linux内存管理学习笔记-第6节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 郝健 ...

最新文章

  1. scala言语基础学习八
  2. 英特尔提出了一个数学公式,以此证明自动驾驶汽车的安全性
  3. java joptionpane调整大小_JAVA应用性能监控之JVM层GC调优
  4. 学习面试题Day08
  5. 利用Maven逆向工程生成mybatis映射文件
  6. 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
  7. mysql索引 order by_MySQL 通过索引优化含ORDER BY的语句
  8. 约瑟夫环(简单版)c语言解决
  9. 夜间灯光数据dn值_探讨DMSP/OLS夜间灯光数据的校正
  10. python+iOS自动化环境搭建
  11. 批量提取 srt 字幕文件中的文字
  12. 聚名:“虎虎酒”商标正在申请中,电视剧《赘婿》引商标注册热潮!
  13. 2020年第十一届C/C++ B组第一场蓝桥杯省赛真题
  14. python如何保存excel文件
  15. 合工大计算机录取分数,合肥工业大学适合“捡漏”的专业,录取分数最低
  16. 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
  17. python音乐库_python - 网易云音乐的 Python 组件库
  18. 万拓单控存储DS1800
  19. Win10连接Bose QC30蓝牙耳机 已配对但连接不成功
  20. mit 6.NULL简单记录

热门文章

  1. Database之SQLSever:SQLSever基础知识进阶、软件安装注意事项、软件使用经验总结之详细攻略
  2. BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
  3. Anaconda多环境多版本python配置指导
  4. 远程连接MySQL数据库失败
  5. Agiliq署名的免费python书籍
  6. Leetcode 436.寻找右区间
  7. 任务01——谈谈对参与工作室的预期
  8. codevs1316 文化之旅
  9. 给大忙人看的Java核心技术笔记(8、Stream)
  10. WinForm 天猫2013双11自动抢红包【源码下载】