物理内存的管理

简介

物理内存:

1.最大物理内存

10-10-12分页,最多识别物理内存为4GB
2-9-9-12分页,最多识别物理内存为GB

2.操作系统限制

为什么在xp中,明明是2-9-9-12分页,仍然无法超越4GB呢?

因为操作系统(操作系统内核文件里面的几个函数)的限制,和32位无关。

3.实际物理内存:

MmNumberOfPhysicalPages * 4=物理内存
在这里插入图片描述

查询到数据为
在这里插入图片描述

0x7ff7c,这个数据是以物理页(4KB)为单位,转为KB为单位的话
需要乘以4即可

Windows采用什么方式管理物理内存:

1.全局数组:

数组指针:_MMPFN * MmPfnDatabase
在这里插入图片描述

使用一个结构体数组,这里面的每一个成员都是一个MMPFN(大小一般为0x1c),这个数组中包含了所有的物理页(包含使用或者未使用或者坏的)
但是这个结构体里面并未存放成员所对应的物理页地址,结构体中是通过 数组索引值+000去找到相应的物理页所在的物理地址,
举个例子:
结构体中通过数组索引为0的物理页的物理地址为 0x0000
结构体中通过数组索引为1的物理页的物理地址为 0x1000
结构体中通过数组索引为2的物理页的物理地址为 0x2000

数组长度:MmNumberOfPhysicalPages

2.数组成员:

(也称页帧数据库)_MMPFN(一个物理页对应这样一个结构体)
+0x000 u1 :__unnamed
+0x004 PteAddress : Ptr32 _MMPTE
+0x008 u2 :__unnamed
+0x00c u3 :__unnamed
+0x010 OriginalPte :__MMPTE
+0x018 u4:__unnamed

3.物理页状态:

通过PageLocation位来展示物理页的状态
在这里插入图片描述

(首先,此时是基于未用的前提才分为6种状态,并非使用中:)
0:MmZeroedPageListHead 零化状态
1:MmFreePageListHead 空闲状态
2:MmStandbyPageListHead
3:MmModifiedPageListHead
4:MmModifiedNoWritePageListHead
5:MmBadPageListHead 坏页状态

4.操作系统的6个链表

MmBadPageListHead坏链

MmZeroedPageListHead零化链表(是系统在空闲的时候进行零化的,不是程序自己清零那种)

MmFreePageListHead空闲链表(物理页周转使用的,刚被释放的物理页是没有清0,系统空闲的时候有专门的线程从这个队列摘取物理页,加以清0后再挂入MmZeroedPageListHead)

MmStandbyPageListHead备用链表(当系统内存不够用时,操作系统会把物理内存中的数据交换到硬盘上,此时页面不是直接挂到空闲链表上去,而是挂到备用链,虽然我释放了,但是里面的内容还是有意义的)

MmModifiedPageListHead

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/113821356