您的位置:首页 > 其它

熬之滴水成石:最想深入了解的内容--windows内核机制(16)

2013-12-03 00:02 387 查看
67--内存管理(5)

内存管理是离不开池这个圈子的,我们也可以理解这个池是个特殊的模块。在windowsOS中,在内核模块中或是在设备驱动程序使用过程中都有内存池的运用。这样的内存池在windows的环境中被称作换页内存池,还有一个叫非换页内存池。理解换页内存池,你可以联想到的场景:当池内的内存在物理内存不够的时候就会被换到外存中去,而非换页内存池中的内存则总是存在物理内存之间。根据windows本身的架构,分别称呼为系统内存池和执行体内存池。在执行体的内存是基于页面管理的机制,在系统层的内存是基于执行体内存管理基础之上的,主要是针对性的提供服务。

这里面又有一些针对性的函数了,像minitializenonpagepool函数,这个函数就是用来初始化管理内存池的一些变量,这些变量大多为空闲页面链表头的一些数组。在系统非换页时起到了非常关键的作用,它基本上确定了非换页内存池的开始和结束的物理页面帧,这样就可以为非换页内存池中建立页表结构了。非换页内存池中内部也分成了两部分,一部分保证了这些页面已经有对应的物理界面的,另一部分则是没有的对应的,当有这部分满足不了内存申请请求时,才会分配真正的物理页面,所以可以这么说,这一部分里都是空闲的页面链表。每个空闲链表节点都包含了1、2、3、4或者是>4的页面。当需要从这个非换页池分配页面时,则根据指定的代销换成对应额页面数,然后从数组中选择适当的空闲链表找,直到找到一个节点能满足自己需求的页面,便将该节点从这个链表中移除出来,如果该界面满足了请求页面数要求并且还有多的页面,那么后面的部分的节点数页面返回给请求,前段剩余的页面将被作为一个新的空闲链表加入的适当的空闲链表中去。还有一种情况,假设在空闲链表数组中都找不到合适的空闲节点数,那么这个时候管理内存便会试图扩展非换页内存池以满足所需求的页面数。这些使用完的页面回收也是有专门的函数来完成的,其原理都是根据起始地址找到页表,然后找到页编号,再定位PFN数据库等一系列操作找到结束页面。将其关联的空闲页面合成一个较大的空闲快。链表用法处理申请和释放已经是一种优化的算法了,因为处理这个过程的链表相当于内存池的一个单页缓存区,申请也好释放也好,只是相当于在单链表中的插入和移除动作而已。

(未完待续.............)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: