windows内核情景分析学习笔记7

来源:互联网 发布:nginx限制ip段访问 编辑:程序博客网 时间:2024/06/05 23:42

 1、内核对于物理页面的管理

物理内存的管理和使用以页面为单位,所以物理内存的管理实际上是对物理页面的管理。

在内核中,物理页面是以数据结构PHYSICAL_PAGE代表的,其定义如下:

 

每个PHYSICAL_PAGE代表一个物理页面,在系统初始化时,会构建起一个元素为PHYSICAL_PAGE的数组MmPageArray,这是一个全局变量,系统中有多少物理页面,这个数组就有多大。

这样,以一个物理页面的页面号(pfn)为下标,就可以找到这个物理页面对应的PHYSICAL_PAGE(MmPageArray[pfn])。

物理地址与其所在页面的页面号有着固定的关系,因为一个页面就是4KB,所以有如下定义:

 

PHYSICAL_PAGE中的Type字段标示物理页面的性质:

显然,物理页面有三种,即空闲的页面、使用中的页面、用于BIOS的页面。

 

ListEntry字段用于将这个PHYSICAL_PAGE链入某个队列,内核中定义了如下物理页面队列:

①物理地址0x100000以下即最低1MB范围中的页面用于BIOS,所以都在BiosPageListHead队列中。

空闲队列有两个:

②FreeZeroedPageListHead已清零页面。

③FreeUnzeroedPageListHead未清零页面。如刚被释放的物理页面时未经清0处理的。

内核线程MmZeroPageThreadMain受调度运行后,会从FreeUnzeroedPageListHead队列中摘取物理页面,清零后将其挂入FreeZeroedPageListHead队列。

④使用中的页面队列UsedPageListHeads是个队列数组,MC_MAXIMUM定义为4。其实是按照物理页面的用途分为4个队列。

其四个用途定义如下:

 

所以,最为典型的物理页面周转过程为:

①从FreeZeroedPageListHead队列开始

②经分配用于某个用户空间虚存页面的映射,所以该物理页面进入UsedPageListHeads[MC_USER]队列

③使用后释放,该物理页面进入FreeUnzeroedPageListHead队列

④内核线程MmZeroPageThreadMain受调度运行后,该页面又回到FreeZeroedPageListHead队列

 

2、常用函数

物理页面的分配使用MmAllocPage()函数,其函数实现如下:

参数Consumer表明页面用途,决定了分配成功的物理页面挂入哪一个队列。SavedSwapEntry标示页面交换文件的位置,取0标示没有倒换文件。

原创粉丝点击