当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .