能力值:
( LV2,RANK:10 )
|
-
-
26 楼
学习了 不过好多看不懂呢
|
能力值:
( LV6,RANK:90 )
|
-
-
27 楼
接触工作集了,留心过这位朋友的问题,顺便多了解了一下。工作集好像是用单向链表来实现的吧,
每一项代表一个物理内存页面。链表项的增加和删除,都是在页面异常处理例程和 页面倒出到交换文件的处理例程里实现的。
在处理页面异常时,申请的物理页面会加入链表(MmInsertRmaps),三个相关的仅有的函数:
MmNotPresentFaultSectionView
MmAccessFaultSectionView
MmNotPresentFaultVirtualMemory
在将页面倒出时,归还物理内存是会从链表中删除(MmDeleteAllRmaps), 二个相关的仅有的函数:
MmPageOutVirtualMemory
MmPageOutSectionView
感觉工作集是为配合页面倒出而设。物理内存的平衡例程里的修剪函数的参数只有一个物理页面号,这样它没法知道这个物理页面到底是属于哪个进程。而系统必须知道这个信息,否则它没法根据页面项获得此页面对应交换文件号和偏移,没法取消该进程对应的页表映射。
有了工作集就好办了,根据物理页面号就可以找到工作集链表头,工作集链表项里保存有进程eprocess指针,这样就对应上了。
还没发现还有什么地方用到了工作集00!
|
能力值:
( 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使用不同的数据结构管理的可是系统不同的区域,地址属于哪个区域可是一目了然啊,呵呵。
|
能力值:
( LV4,RANK:50 )
|
-
-
29 楼
结束语
===================================================
看了一段时间的wrk,觉得自己对nt内核有了一点了解,一时兴起,想和大家分享一下自己的收获和心得,所以才有此贴。
苦于本人对NT内核理解还不深、加上最近工作比较忙,写的比较随意,没有好好组织,写的比较乱。再加上关注(感兴趣)本帖的人不多,所有这个贴子也不想继续了。
在没有指导下看nt内核源码的确比较难,近来听说潘爱民的大作《windows内核原理与实现》已经出版了,在网上一找,居然找到了部分章节,发现该书的确对阅读wrk有很大的帮助,在这个贴子中我想说的内容,书里居然都是有的,这个贴子也没有必要了。
1楼附上《windows内核原理与实现》部分章节,献给关心该贴的朋友。
|
|
|