windbg下看系统非分页内存

    这篇文章实在是闲的无聊才写的,因为快过年了...文章基于xpsp3

    先看看和非分页内存相关的全局变量,也好有个大局观:

kd> x nt!MmNonPaged*
805517d8          nt!MmNonPagedPoolEnd = <no type information>
8055af84          nt!MmNonPagedPoolEnd0 = <no type information>
8055af80          nt!MmNonPagedPoolExpansionStart = <no type information>
8055fb20          nt!MmNonPagedSystemStart = <no type information>
8055af60          nt!MmNonPagedPoolFreeListHead = <no type information>
8055ae38          nt!MmNonPagedPoolStart = <no type information>

kd> dd nt!MmNonPagedPoolStart L1
8055ae38  8164b000
kd> dd nt!MmNonPagedPoolEnd0 L1
8055af84  86800000
    x nt!MmNonPaged*列出了可能和非分页内存池相关的全局变量。在这篇文章里,主要涉及3个变量:
nt!MmNonPagedPoolEnd0:保存基本NonPagedd内存池的结束地址
nt!MmNonPagedSystemStart:保存基本NonPagedd内存池的开始地址
nt!MmNonPagedPoolFreeListHead:空闲Nonpaged页面队列头数组;xp下该数组有4个元素,每个数组元素都是_LIST_ENTRY结构。MmNonPagedPoolFreeListHead[0]中的节点包含1个页面;MmNonPagedPoolFreeListHead[1]中的节点保存了2个页面,以此类推。

    来看下这几个队列的使用情况:

kd> dd nt!MmNonPagedPoolFreeListHead L8 ;下面的[]是我自己加的,用于分割各个_LIST_ENTRY结构
8055af60  [8055af60 8055af60] [86674000 863e9000]
8055af70  [86071000 86071000] [863ec000 8164b000]
    从dd的结果可以看出,现在数组元素0和2是空队列,里面的空闲页面已被瓜分完。也就是单页面和3页面的Nonpaged内存池已用完。现在我们知道Nonpaged内存池的使用情况,再来看看各个空闲页面链表中的节点。既然MmNonPagedPoolFreeListHead[0]和MmNonPagedPoolFreeListHead[2]已经告罄,我们就来看看剩下的两个链表:

kd> dt nt!*MMFREE*
          ntoskrnl!_MMFREE_POOL_ENTRY
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY
   +0x000 List             : _LIST_ENTRY
   +0x008 Size             : Uint4B
   +0x00c Signature        : Uint4B
   +0x010 Owner            : Ptr32 _MMFREE_POOL_ENTRY
    上面的结构是空闲页面队列中各个节点的类型。以MmNonPagedPoolFreeListHead[1]中的节点为例,每个节点中包含2个连续的页面,每个页面的起始位置被用作ntoskrnl!_MMFREE_POOL_ENTRY结构。再继续下去前,先让我介绍一下各个域的作用:

1.只有节点中的第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域会被加入到MmNonPagedPoolFreeListHead[1]所在的空闲页面链表中,第二个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域不起作用;
2.由于节点中的两个页面的地址是连续的,因此,在MmNonPagedPoolFreeListHead[1]中定位到第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!_LIST_ENTRY域,再加上PAGE_SIZE,就可以获得后续页面。至于ntoskrnl!_MMFREE_POOL_ENTRY!Size的作用,则用于反应节点中有多少个页面;
3.除了节点中第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY!Owner域指向本页面的ntoskrnl!_MMFREE_POOL_ENTRY以外,节点中的其他页面的Owner域都指向第一个页面的ntoskrnl!_MMFREE_POOL_ENTRY。

    了解了这个背景后,看下MmNonPagedPoolFreeListHead[1]中的节点的值:

kd> dt _LIST_ENTRY 8055af60+8 ;MmNonPagedPoolFreeListHead[1]的地址
nt!_LIST_ENTRY
 [ 0x86674000 - 0x863e9000 ]
   +0x000 Flink            : 0x86674000 _LIST_ENTRY [ 0x863c8000 - 0x8055af68 ] ;内存0x86674000处有一个_MMFREE_POOL_ENTRY类型的节点
   +0x004 Blink            : 0x863e9000 _LIST_ENTRY [ 0x8055af68 - 0x86197000 ]
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY 0x86674000 
   +0x000 List             : _LIST_ENTRY [ 0x863c8000 - 0x8055af68 ]
   +0x008 Size             : 2 ;节点中有2个页面
   +0x00c Signature        : 2
   +0x010 Owner            : 0x86674000 _MMFREE_POOL_ENTRY ;Owner指向自己
kd> dt ntoskrnl!_MMFREE_POOL_ENTRY 0x86674000+0x1000 ;节点中的第二个页面
   +0x000 List             : _LIST_ENTRY [ 0x44524352 - 0x90028 ]
   +0x008 Size             : 0x35e41f0
   +0x00c Signature        : 0
   +0x010 Owner            : 0x86674000 _MMFREE_POOL_ENTRY ;owner指向前一个页面的_MMFREE_POOL_ENTRY结构

    Windows就是基于这样的结构,对Nonpaged内存池进行管理的~


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值