<b>xp下用户程序空间分配(2):栈</b>[VC/C++编程]
本文“<b>xp下用户程序空间分配(2):栈</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
每个线程都有自己的栈空间,这个空间大小是在CreateThread时指定的,而主线程的栈则是由xp在创 建进程时指定的,在vs2008下设置一个断点,中止程序的履行,可以看到主线程ESP的值为0x00124914, 这个指针落在下面这个区域:
基址 | 分配基址 | 分配保护 | 大小 | 状况 | 保护 | 范例 |
0011e000 | 00030000 | 00000004
PAGE_READWRITE |
00012000 | 00001000
MEM_COMMIT |
00000004
PAGE_READWRITE |
00020000
MEM_PRIVATE |
这块空间的上限是0x0013 0000,这个值与我们读出来的NT_TIB构造体里面的StackBase的值是一致的 ,也就是说主线程的栈空间从0x0013 0000开始往下增长.但是在NT_TIB里面的StackLimit值却只有 0x00000 a000,很明显,可用的栈空间是不只这么一点的.
注意到上述内存区域的分配基址与这个内 存区域的起始地址是不一样的,看看完好的内存块:
基址 | 分配基址 | 分配保护 | 大小 | 状况 | 保护 | 范例 |
00030000 | 00030000 | 00000004
PAGE_READWRITE |
000ed000 | 00002000
MEM_RESERVE |
00000000 | 00020000
MEM_PRIVATE |
0011d000 | 00030000 | 00000004
PAGE_READWRITE |
00001000 | 00001000
MEM_COMMIT |
00000104
PAGE_READWRITE PAGE_GUARD |
00020000
MEM_PRIVATE |
0011e000 | 00030000 | 00000004
PAGE_READWRITE |
00012000 | 00001000
MEM_COMMIT |
00000004
PAGE_READWRITE |
00020000
MEM_PRIVATE |
也就是说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的指引下,我们可以很简单地从这 些内存块中找出别的的栈:
基址 | 分配基址 | 分配保护 | 大小 | 状况 | 保护 | 范例 |
00390000 | 00390000 | 00000004
PAGE_READWRITE |
0003c000 | 00002000
MEM_RESERVE |
00000000 | 00020000
MEM_PRIVATE |
003cc000 | 00390000 | 00000004
PAGE_READWRITE |
00001000 | 00001000
MEM_COMMIT |
00000104
PAGE_READWRITE PAGE_GUARD |
00020000
MEM_PRIVATE |
003cd000 | 00390000 | 00000004
PAGE_READWRITE |
00003000 | 00001000
MEM_COMMIT |
00000004
PAGE_READWRITE |
00020000
MEM_PRIVATE |
以上是“<b>xp下用户程序空间分配(2):栈</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |