快速业务通道

xp下用户程序空间分配(2):栈

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

每个线程都有自己的栈空间,这个空间大小是在CreateThread时指定的,而主线程的栈则是由xp在创 建进程时指定的,在vs2008下设置一个断点,中断程序的执行,可以看到主线程ESP的值为0x00124914, 这个指针落在下面这个区域:

xp下用户程序空间分配(2):栈

这块空间的上限是0x0013 0000,这个值与我们读出来的NT_TIB结构体里面的StackBase的值是一致的 ,也就是说主线程的栈空间从0x0013 0000开始往下增长。但是在NT_TIB里面的StackLimit值却只有 0x00000 a000,很显然,可用的栈空间是不只这么一点的。

注意到上述内存区域的分配基址与这个内 存区域的起始地址是不一样的,看看完整的内存块:

xp下用户程序空间分配(2):栈

也就是说windows分配这块空间的时候是从0x0003 0000 ~ 0x0013 0000的,恰好1M,这也是默认情况 下主线程的栈空间大小。但由于我们实际还没有使用这么大的栈空间,所以0x0003 0000开始的这一块空 间的状态是MEM_RESERVE。

再看中间的这个内存区域,它的保护标志多了个PAGE_GUARD,MSDN里面这 样解释这个标志位:

Pages in the region become guard pages. Any attempt to access a guard page causes the system to raise a STATUS_GUARD_PAGE_VIOLATION exception and turn off the guard page status. Guard pages thus act as a one-time access alarm. For more information, see Creating Guard Pages.

When an access attempt leads the system to turn off guard page status, the underlying page protection takes over.

从这里大致可以知道,当ESP向下增长超过 目前已经分配的空间,此时将触发一个异常,然后windows再调整这几块内存页的属性。当然,ESP的增 长不能超过整个栈的大小,否则程序就无法继续了。

在PAGE_GUARD的指引下,我们可以很轻易地从这 些内存块中找出其它的栈:

xp下用户程序空间分配(2):栈

这个栈属于另外一个线程,其大小为0x0003 c000,实际只使用了0x0000 3000。

下面是另一个线程的栈:

xp下用户程序空间分配(2):栈

总共三个栈空间,和程序里面的三个线程一一对应。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号