青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我們知道每個線程初始堆棧的默認空間是1M, 我們可以在VC編譯的Linker項里進行設置,該值會被編譯進最終的PE可執行文件中。線程堆棧內存包括commit部分和reserver部分,我們上面說的1M實際上指reserve部分,系統為了節約內存,并不會把所有reserve的1M都提交物理內存(commit), 所以初始只是提交部分內存。

我們可以隨便找一個程序,通過WinDbg進行驗證:!address -f:stack
  BaseAddr EndAddr+1 RgnSize Type State Protect Usage
---------------------------------------------------------------------------------------------
   90000 184000 f4000 MEM_PRIVATE MEM_RESERVE Stack [~0; 16d8.13ec]
  184000 185000 1000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE|PAGE_GUARD Stack [~0; 16d8.13ec]
  185000 190000 b000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE Stack [~0; 16d8.13ec]

可以看到一個線程的堆棧分3部分:0xB000字節的MEM_COMMIT內存,0x1000字節的MEM_COMMIT & PAGE_GUARD內存,還有0xF4000字節的MEM_RESERVE內存,總共是0xB000+0x1000+0xf4000 = 0x100000 = 1M

通過實驗,我們可以看到線程堆棧只提交(commit)了一部分內存,大部分內存是reserve的,現在的問題是堆棧在增長的過程中,它是如何提交(commit)內存的? 我們知道,我們在函數中申明一個N字節大小的局部變量,它就是在線程的堆棧中申請的空間(實際上只需要ESP-N)就可以了。我們如果觀察過函數的反匯編代碼,會注意到它沒有commit內存相關的代碼。 那么究竟最終它是如何commit那些reserve的內存的呢? 

曾經面試被問到這個問題, 因為沒有看過相關的書籍, 沒回答出來...

最近思考這個問題, 終于在張銀奎的<<軟件調試>>里找到了答案:

系統在提交棧空間時會故意多提交一個頁面,稱這個頁面為棧保護頁面(Stack Guard Page), 這點我們可以在上面WinDbg的實驗中驗證。棧保護頁面具有特殊的PAGE_GUARD屬性,當具有如此屬性的內存頁被訪問時,CPU會產生頁錯誤并開始執行系統的內存管理函數,當內存管理函數檢測到PAGE_GUARD屬性后,會清除對應頁面的PAGE_GUARD屬性,然后調用一個名為MiCheckForUserStackOverflow的系統函數,這個函數會從當前線程的TEB中讀取用戶態棧的基本信息并檢查導致異常的地址,如果導致異常的被訪問地址不屬于棧空間范圍,則返回STATUS_GUARD_PAGE_VIOLATION,否則MiCheckForUserStackOverflow函數會計算棧中是否還有足夠的剩余空間可以創建一個新的棧保護頁面。如果有,則調用ZwAllocateVirtualMemory從保留的空間中在提交一個具有PAGE_GUARD屬性的內存頁。新的棧保護頁與原來的緊鄰,經過這樣的操作后,棧的保護頁向低地址方向平移了一位,棧的可用空間增大了一個頁面的大小,這便是所謂的棧空間自動增長。

棧溢出是指當提交的棧空間再被用完,棧保護頁又被訪問時,系統便會重復以上過程,直到當棧保護頁距離保留空間的最后一個頁面只剩一個頁面的空間時,MiCheckForUserStackOverflow函數會提交倒數第二個頁面,但不再設置PAGE_GUARD屬性,因為最后一個頁面永遠保留不可訪問,所以這時棧增長到它的最大極限,為了讓應用程序知道棧將用完,MiCheckForUserStackOverflow函數返回STATUS_STACK_OVERFLOW,觸發棧溢出異常。

最后感概技術深了可以再深,從C++編譯器到CRT運行庫, 再到操作系統, 從用戶態到內核和驅動, 最后到硬件, 原理背后還有原理, 真正能掌握所有細節的又有幾人呢?
posted on 2014-10-12 22:03 Richard Wei 閱讀(5482) 評論(3)  編輯 收藏 引用 所屬分類: windbg

FeedBack:
# re: 線程堆棧是如何增長的[未登錄]
2014-10-13 10:02 | ~
這是操作系統里能找到的, 怎么在軟件調試這書里去找呢。
(好吧,學習知識的方式是多樣的,來源也有很多)  回復  更多評論
  
# re: 線程堆棧是如何增長的
2014-12-31 10:11 | liyou
好文章,點面齊全  回復  更多評論
  
# re: 線程堆棧是如何增長的
2015-01-10 09:42 | jogosdofriv
這是操作系統里能找到的  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩亚洲国产精品| 欧美韩国日本一区| 亚洲第一网站| 欧美成人资源| 午夜视频一区二区| 久久免费视频在线观看| 欧美国产日韩一区| 国内久久婷婷综合| 久久久人成影片一区二区三区| 亚洲视频一区| 欧美视频在线观看视频极品| 99精品欧美一区二区蜜桃免费| 日韩一级不卡| 国产精品系列在线| 久久噜噜亚洲综合| 久久综合五月天婷婷伊人| 精品二区视频| 亚洲国产精品热久久| 免费日韩成人| 午夜精品久久久久久久男人的天堂 | 欧美视频三区在线播放| 亚洲天堂网站在线观看视频| 在线亚洲精品| 在线观看成人av| 中文精品在线| 亚洲激情在线视频| 欧美在线视频观看| 亚洲免费观看在线视频| 午夜精品久久久久久久| 亚洲国产91| 午夜亚洲福利在线老司机| 在线日韩av| 亚洲综合色网站| 国产精品99久久久久久久女警| 亚洲欧美日韩国产精品| 亚洲性色视频| 欧美日韩精品免费观看视一区二区| 欧美主播一区二区三区| 欧美日韩一区二区三区免费| 欧美电影在线免费观看网站| 国产精品a久久久久| 亚洲高清久久久| 狠狠色丁香久久婷婷综合_中| 在线中文字幕一区| 中文一区字幕| 国产精品久久毛片a| 亚洲在线一区| 午夜伦欧美伦电影理论片| 国产伦精品一区二区三| 欧美一区国产在线| 久久这里有精品15一区二区三区| 欧美激情一区二区| 夜夜嗨av一区二区三区四区| 日韩视频二区| 欧美性色综合| 中文av一区特黄| 国产欧美日韩在线观看| 亚洲欧美在线免费观看| 米奇777在线欧美播放| 伊人春色精品| 欧美日一区二区在线观看 | 欧美国产精品中文字幕| 亚洲三级视频在线观看| 在线视频一区二区| 国产亚洲精品一区二555| 欧美一区二区三区视频在线观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲激情电影中文字幕| 国产精品ⅴa在线观看h| 久久精品av麻豆的观看方式| 亚洲国产天堂久久国产91| 亚洲一区一卡| 亚洲精品国产精品国产自| 国产精品久久精品日日| 免费h精品视频在线播放| 亚洲色图自拍| 亚洲精品一区二区三区婷婷月| 欧美有码在线视频| 一本色道综合亚洲| 亚洲成色精品| 国外成人在线| 国产精品伊人日日| 国产精品久久久久久久久久妞妞 | 最新国产成人在线观看| 国产精品视频xxxx| 国产精品久久久久久久久久免费 | 蜜臀91精品一区二区三区| 美女国产精品| 欧美国产高清| 欧美精品一区二区三区在线看午夜| 欧美成人精品激情在线观看| 亚洲桃花岛网站| 亚洲午夜高清视频| 午夜精品一区二区三区在线| 一区二区三区不卡视频在线观看| 欧美激情一区二区三区| 欧美成人精品激情在线观看| 久久青草久久| 欧美黄污视频| 亚洲美女视频在线免费观看| 一二三区精品| 欧美一二三区精品| 美女91精品| 国产精品久久二区二区| 国产久一道中文一区| 亚洲欧美一区二区三区在线| 亚洲视频一二| 久久久激情视频| 欧美日韩国产一区二区| 国产精品一卡| 91久久国产综合久久91精品网站| 99re6这里只有精品视频在线观看| 日韩视频在线观看免费| 午夜在线成人av| 欧美激情一区二区三区| 一区二区三区福利| 欧美a级片一区| 国产在线精品二区| 在线亚洲+欧美+日本专区| 欧美韩国一区| 欧美成人精品影院| 亚洲肉体裸体xxxx137| 久久天天躁夜夜躁狠狠躁2022 | 欧美一区二区在线观看| 国产区亚洲区欧美区| 欧美日韩成人综合在线一区二区| 国产欧美精品va在线观看| 亚洲综合日韩| 香蕉av777xxx色综合一区| 国产日韩欧美精品综合| 久久精品视频99| 久久精品中文字幕一区| 亚洲黄色免费| 亚洲精品国产精品国自产在线| 欧美一级专区| 一本色道久久88精品综合| 中国成人黄色视屏| 国产日韩欧美高清免费| 乱码第一页成人| 欧美日韩成人| 可以看av的网站久久看| 欧美福利视频| 久久亚洲精品中文字幕冲田杏梨| 久久久精品久久久久| 亚洲一区在线观看视频| 久久久精品五月天| 欧美亚洲一区三区| 欧美高清在线精品一区| 亚洲国产91色在线| 亚洲人体影院| 黄网站色欧美视频| 一区二区欧美精品| 日韩一二三在线视频播| 免费亚洲视频| 亚洲欧洲日夜超级视频| 在线日韩欧美视频| 久久天堂成人| 女人香蕉久久**毛片精品| 国外成人在线| 久久亚洲综合色| 蜜桃久久精品一区二区| 日韩午夜免费| 亚洲电影免费观看高清完整版在线| 欧美福利视频| 亚洲图片在区色| 欧美成人一区在线| 一本色道久久综合亚洲二区三区| 欧美专区中文字幕| 久久久久网站| 欧美大片免费久久精品三p| 久久久久成人精品| 久久亚洲精品一区| 亚洲亚洲精品在线观看 | 一区二区高清| 欧美3dxxxxhd| 欧美www在线| 亚洲激情综合| 亚洲国产一区在线| 久久国产主播| 亚洲国产毛片完整版| 国产一区二区三区四区在线观看| 亚洲欧美日韩人成在线播放| 亚洲国产精品成人久久综合一区| 亚洲风情亚aⅴ在线发布| 欧美国产亚洲另类动漫| 亚洲午夜久久久久久久久电影院| 久久一区激情| 中文一区在线| 久久人体大胆视频| 一本色道久久综合狠狠躁篇怎么玩 | 欧美激情精品| 久久深夜福利免费观看| 久久中文久久字幕| 99热精品在线| 亚洲欧美bt| 亚洲视频免费看| 在线免费观看日本欧美| 欧美视频免费| 亚洲精品极品| 久久久亚洲一区|