Windows内存管理学习笔记(二)—— 物理内存的管理
Windows内存管理学习笔记(二)—— 物理内存的管理
- 物理内存
- 实验一:理解MmNumberOfPhysicalPages
- MmPfnDatabase
- _MMPFN
- 物理页状态
- 六个链表
- 实验二:理解零化链表
- 实验三:查看进程占用的所有物理页
物理内存
最大物理内存
- 10-10-12分页:最多识别4GB物理内存
- 2-9-9-12分页:最多识别64GB物理内存
操作系统限制
- 在xp系统中,即使采用2-9-9-12分页,仍然无法使用超过4GB的物理内存(可理解为 4GB以上的内存条)
- 而在windows 2003或windows 2008系统中,即使为32位系统,但若采用2-9-9-12分页,就可以识别4GB以上的物理内存
思考:为什么?
答案:由内核文件中的几个函数限制
实际物理内存
物理内存总数 = MmNumberOfPhysicalPages * 4
实验一:理解MmNumberOfPhysicalPages
1)打开任务管理器,查看物理内存
2)查看MmNumberOfPhysicalPages(单位:物理页)
命令:dd MmNumberOfPhysicalPages
3)计算物理内存
结论:物理内存总数 = MmNumberOfPhysicalPages * 4
思考:这么多物理内存,操作系统如何进行管理
答案:通过全局数组MmPfnDatabase
MmPfnDatabase
描述:
- 全局结构体数组,称为“页帧数据库”,包含了当前操作系统中所有的物理页
- 每一个物理页都有一个对应的MMPFN结构体
- 通过全局变量MmPfnDatabase可以找到这个结构体的起始位置(在WinDbg中使用命令
dd MmPfnDatabase
进行查看) - 每一个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与物理页的对应关系:
通过当前MMPFN结构体找到对应的物理页
物理页 = 当前_MMPFN索引值*0x1000
通过当前物理页找到对应的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通过六个链表,将所有相同类型的物理页串到一起
MmZeroedPageListHead
零化链表(是系统在空闲的时候进行零化的,不是程序自己清零的那种)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;
MmStandbyPageListHead
备用链表(当系统内存不够的时候,操作系统会把物理内存中的数据交换到硬盘上,此时页面不是直接挂到空闲链表上去,而是挂到备用链表上,虽然我释放了,但里边的内容还是有意义的)- MmModifiedPageListHead
- MmModifiedNoWritePageListHead
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内存管理学习笔记(二)—— 物理内存的管理相关推荐
- 研发管理学习笔记4-学习研发管理的51CTO视频课
视频学习课程地址: https://edu.51cto.com//center/course/lesson/index?id=279539 这是一个付费课程,专门写给技术管理方面的新手看的,讲师在很多 ...
- DB2 UDB V8.1 管理 学习笔记
DB2 UDB V8.1 管理 学习笔记 DB2 学习笔记 - AIview.com Last updated on Wednesday, August 24, 2005 Skip to naviga ...
- Windows编程课程学习笔记
一. Windows程序内部运行机制--Windows编程课程学习笔记 二. MFC框架程序分析--Windows编程课程学习笔记 三. 简单绘图--Windows编程课程学习笔记 四. 文本编程-- ...
- Windows内存管理学习笔记(三)—— 无处不在的缺页异常
Windows内存管理学习笔记(三)-- 无处不在的缺页异常 缺页异常 实验一:设置虚拟内存 无处不在的缺页 位于页面文件 保留与提交的误区 实验二:理解缺页异常 EXECUTE_WRITECOPY ...
- Windows内存管理学习笔记(一)—— 线性地址的管理
Windows内存管理学习笔记(一)-- 线性地址的管理 用户空间线性地址的管理 实验一:理解用户空间线性地址管理 Private Memory 实验二:理解Private Memory 堆 实验三: ...
- 郝健: Linux内存管理学习笔记-第4节课
前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 摘要 page cache free命令的详细解释 ...
- Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础
Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...
- 郝健: Linux内存管理学习笔记-第5节课
前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 摘要 ...
- 郝健: Linux内存管理学习笔记-第6节课
前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 郝健 ...
最新文章
- scala言语基础学习八
- 英特尔提出了一个数学公式,以此证明自动驾驶汽车的安全性
- java joptionpane调整大小_JAVA应用性能监控之JVM层GC调优
- 学习面试题Day08
- 利用Maven逆向工程生成mybatis映射文件
- 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
- mysql索引 order by_MySQL 通过索引优化含ORDER BY的语句
- 约瑟夫环(简单版)c语言解决
- 夜间灯光数据dn值_探讨DMSP/OLS夜间灯光数据的校正
- python+iOS自动化环境搭建
- 批量提取 srt 字幕文件中的文字
- 聚名:“虎虎酒”商标正在申请中,电视剧《赘婿》引商标注册热潮!
- 2020年第十一届C/C++ B组第一场蓝桥杯省赛真题
- python如何保存excel文件
- 合工大计算机录取分数,合肥工业大学适合“捡漏”的专业,录取分数最低
- 计算机培训计划方案结尾怎么写,学习计划怎么写结尾
- python音乐库_python - 网易云音乐的 Python 组件库
- 万拓单控存储DS1800
- Win10连接Bose QC30蓝牙耳机 已配对但连接不成功
- mit 6.NULL简单记录
热门文章
- Database之SQLSever:SQLSever基础知识进阶、软件安装注意事项、软件使用经验总结之详细攻略
- BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
- Anaconda多环境多版本python配置指导
- 远程连接MySQL数据库失败
- Agiliq署名的免费python书籍
- Leetcode 436.寻找右区间
- 任务01——谈谈对参与工作室的预期
- codevs1316 文化之旅
- 给大忙人看的Java核心技术笔记(8、Stream)
- WinForm 天猫2013双11自动抢红包【源码下载】