chkstk 分析及注意點

2021-06-16 03:37:42 字數 2067 閱讀 4996

_chkstk()這是乙個用來分配堆疊用的。原始碼如下

_chkstk:

push           ecx

cmp            eax,1000h

lea            ecx,[esp+8]

jb             lastpage

probepages:

sub            ecx,1000h

sub            eax,1000h

test           dword ptr [ecx],eax

cmp            eax,1000h

jae            probepages (0040818c)

lastpage:

sub            ecx,eax

mov            eax,esp

test           dword ptr [ecx],eax

mov            esp,ecx

mov            ecx,dword ptr [eax]

mov            eax,dword ptr [eax+4]

push           eax

ret大概流程

1)      「chkstk routine is a helper routine for the c compiler. for x86

compilers, _chkstk routine is called when the local variables exceed

4096 bytes; for x64 compilers it is 4k and 8k respectively.」

即, 當乙個函式區域性變數超過乙個頁面大小4k的時候, 編譯器會自動插入這個函式。插入這個函式的位置在:

push        ebp

mov         ebp,esp

mov         eax,1000d4h

call       _chkstk()

2)      這個函式做什麼?當函式為堆疊分配的頁面不夠時, (堆疊預設大小為1m), 堆疊需要

更多的頁面時呼叫這個函式。

當堆疊使用大於分配的大小(預設1m)時,產生_xcpt_unable_to_grow_stack.

3)      當呼叫這個函式時, 首先外面對eax進行賦值(已經分配的堆疊大小 + 即將分配給函式區域性變數的堆疊大小)

4)      呼叫 _chkstk() 首先,保持當期esp到eax中,然後開始判斷:如果分配的大小大於乙個頁面, 到第5)步(大多都先第5)步);否則到第6)步。

5)      當需要分配的大小大於乙個頁面, 則增加乙個頁面。「sub eax 1000h」 表示堆疊棧頂下移1000h,[由於堆疊是高位址(棧底部)->低位址(棧頂部)分布],所以堆疊擴大了1000h; 「sub ecx 1000h」表示分配了1000h(1個頁面)之後還需要多少空間;

「test dword ptr [ecx],eax」 表示分配空間,這個時候之前只不過是分配虛存,記憶體沒有 commit  ,這個時候對這個記憶體位址進行讀寫操作都會引發乙個 page fault 異常(_xcpt_guard_page_violation),  os捕獲這個異常,檢查一定的條件,適合的時候就把這個記憶體頁 commit 了,即分配了實際的物理記憶體。然後再次比較需要多少記憶體,如果還是超過1頁(1000h), 則重複第5)步,否則到第6)步。

6)      還需要分配的堆疊空間小於1頁的時候,「sub  ecx,eax」 堆疊繼續擴大(擴大了剩餘大小的空間);然後「mov  esp,ecx」,儲存到原來的esp;並且通過「test」為堆疊分配空間。

7)      最後,esp的值不再是原來的值,堆疊的大小變成: 堆疊原來大小 + 區域性變數需要的堆疊大小 + xx (push 用的一點堆疊的零頭).

如果你的函式中需要乙個很大的區域性變數,那就要注意一點了。因為區域性變數是在存放在堆疊中的,在分配的時候需要會呼叫上面的函式,並檢測位址是否有效。在這個時刻,如果你是在驅動中,那麼很可能會出現藍屏。在應用層可能會崩潰。因此,如果需要使用比較大的資料時,最好是通過動態分配來得到記憶體。

競品分析注意點

競品分析過程是對具有直接競爭關係的產品以及間接競爭關係的產品進行功能評價 邏輯流評價 商業模式評價 迭代發布節奏評價 使用者群評價 技術方案評價等。選取競品分析的維度可以有多種多樣。儘管如此,很多新晉產品經理的競品分析最後就變成了功能評價或者功能羅列。好的競品分析絕不僅僅是功能羅列,而應該是通過該份...

Detour注意點及原理

detourtransactionbegin detourupdatethread getcurrentthread detourattach pvoid g ppresent,new present dword nerr detourtransactioncommit detourtransact...

Detour注意點及原理

cpp view plain copy detourtransactionbegin detourupdatethread getcurrentthread detourattach pvoid g ppresent,new present dword nerr detourtransactionc...