首页
社区
课程
招聘
[原创]乱侃Windows NT内核之内存管理
发表于: 2010-4-22 18:10 22239

[原创]乱侃Windows NT内核之内存管理

2010-4-22 18:10
22239
收藏
免费 7
支持
分享
最新回复 (28)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
学习了 不过好多看不懂呢
2010-5-10 16:04
0
雪    币: 75
活跃值: (623)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
27
接触工作集了,留心过这位朋友的问题,顺便多了解了一下。工作集好像是用单向链表来实现的吧,
每一项代表一个物理内存页面。链表项的增加和删除,都是在页面异常处理例程和 页面倒出到交换文件的处理例程里实现的。
在处理页面异常时,申请的物理页面会加入链表(MmInsertRmaps),三个相关的仅有的函数:
MmNotPresentFaultSectionView
MmAccessFaultSectionView
MmNotPresentFaultVirtualMemory

在将页面倒出时,归还物理内存是会从链表中删除(MmDeleteAllRmaps), 二个相关的仅有的函数:
MmPageOutVirtualMemory
MmPageOutSectionView

感觉工作集是为配合页面倒出而设。物理内存的平衡例程里的修剪函数的参数只有一个物理页面号,这样它没法知道这个物理页面到底是属于哪个进程。而系统必须知道这个信息,否则它没法根据页面项获得此页面对应交换文件号和偏移,没法取消该进程对应的页表映射。
有了工作集就好办了,根据物理页面号就可以找到工作集链表头,工作集链表项里保存有进程eprocess指针,这样就对应上了。

还没发现还有什么地方用到了工作集00!
2010-5-10 18:59
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
28
系统空间管理(补充)
==========================================================

上面提到过,系统空间使用MMPTE_LIST管理非分页内存,这里管理的页面是没有物理映射的,能够访问前需要映射到物理空间。

非分页内存其实有两种,除了上面讨论的一种外,还有一种是在初始化时就已经分配好的,该区域已经建立了物理映射,被称为非分页池,该区域是可以直接使用的,Windows以一般“池”的方法管理该区域,类似用户空间的heap的管理,及空闲链表法,由于被管理的页面是可以直接使用的,所以空闲链表就建立在这些页面上,总共有四个空闲链表,分别记录1、2、3、4及以上个页面大小的空闲内存块,没有什么亮点,就不多说了。

除了非分页内存外,还有一种称为分页内存的空间,这些页面是可以交换到磁盘上的,所以不能保证这些页面是有物理映射的,所以windows用一个数据结构来描述这些页面的分配状态:

typedef struct _MM_PAGED_POOL_INFO {
    PRTL_BITMAP PagedPoolAllocationMap;
    PRTL_BITMAP EndOfPagedPoolBitmap;
    PMMPTE FirstPteForPagedPool;
    PMMPTE LastPteForPagedPool;
    PMMPTE NextPdeForPagedPoolExpansion;
    ULONG PagedPoolHint;
    SIZE_T PagedPoolCommit;
    SIZE_T AllocatedPagedPool;
} MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;

从 PagedPoolAllocationMap项可以看出,Windows是使用位图法记录各个页面的分配状态,有点类似fat文件系统,呵呵。

也许你要问了,Windows分别使用MMPTE_LIST、位图、空闲链表记录系统空间的分配状态,在释放一块内存时,如何知道使用哪一个数据结构呢?其实很简单,从要释放的地址就可以确定了,windows使用不同的数据结构管理的可是系统不同的区域,地址属于哪个区域可是一目了然啊,呵呵。
2010-5-10 23:12
0
雪    币: 184
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
29
结束语
===================================================
看了一段时间的wrk,觉得自己对nt内核有了一点了解,一时兴起,想和大家分享一下自己的收获和心得,所以才有此贴。

苦于本人对NT内核理解还不深、加上最近工作比较忙,写的比较随意,没有好好组织,写的比较乱。再加上关注(感兴趣)本帖的人不多,所有这个贴子也不想继续了。

在没有指导下看nt内核源码的确比较难,近来听说潘爱民的大作《windows内核原理与实现》已经出版了,在网上一找,居然找到了部分章节,发现该书的确对阅读wrk有很大的帮助,在这个贴子中我想说的内容,书里居然都是有的,这个贴子也没有必要了。

1楼附上《windows内核原理与实现》部分章节,献给关心该贴的朋友。
2010-5-12 23:55
0
游客
登录 | 注册 方可回帖
返回
//