程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> xp下用戶程序空間分配(2):棧

xp下用戶程序空間分配(2):棧

編輯:關於C++

每個線程都有自己的棧空間,這個空間大小是在CreateThread時指定的,而主線程的棧則是由xp在創 建進程時指定的,在vs2008下設置一個斷點,中斷程序的執行,可以看到主線程ESP的值為0x00124914, 這個指針落在下面這個區域:

這塊空間的上限是0x0013 0000,這個值與我們讀出來的NT_TIB結構體裡面的StackBase的值是一致的 ,也就是說主線程的棧空間從0x0013 0000開始往下增長。但是在NT_TIB裡面的StackLimit值卻只有 0x00000 a000,很顯然,可用的棧空間是不只這麼一點的。

注意到上述內存區域的分配基址與這個內 存區域的起始地址是不一樣的,看看完整的內存塊:

也就是說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的指引下,我們可以很輕易地從這 些內存塊中找出其它的棧:

這個棧屬於另外一個線程,其大小為0x0003 c000,實際只使用了0x0000 3000。

下面是另一個線程的棧:

總共三個棧空間,和程序裡面的三個線程一一對應。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved