天天看點

淺談棧幀

一、 什麼是棧幀?

什麼是棧幀,首先引用百度百科的經典解釋:“棧幀也叫過程活動記錄,是編譯器用來實作過程/函數調用的一種資料結構。

實際上,可以簡單了解為:棧幀就是存儲在使用者棧上的(當然核心棧同樣适用)每一次函數調用涉及的相關資訊的記錄單元。也許這樣感覺更複雜了,好吧,讓我們從棧開始來了解什麼是棧幀...

棧幀表示程式的函數調用記錄,而棧幀又是記錄在棧上面,很明顯棧上保持了N個棧幀的實體,那就可以說棧幀将棧分割成了N個記錄塊,但是這些記錄塊大小不是固定的,因為棧幀不僅儲存諸如:函數入參、出參、傳回位址和上一個棧幀的棧底指針等資訊,還儲存了函數内部的自動變量(甚至可以是動态配置設定記憶體,alloca函數就可以實作,但在某些系統中不行),是以,不是所有的棧幀的大小都相同。

二,了解

我們拿一個執行個體來探讨一下

淺談棧幀

這是一個在linux下運作的程式,當程式走到*p=fun時會調用fun函數,最後執行reboot指令關機重新開機。這是為什麼呢?我們就拿棧幀來看一下。

首先了解棧幀的基本結構。

淺談棧幀

棧幀其實是兩個指針寄存器,寄存器ebp為幀指針,而寄存器esp為棧指針,當程式運作時,棧指針可以移動(大多數的資訊的通路都是通過幀指針的)。總之簡單一句話,棧幀的主要作用是用來控制和儲存一個過程的所有資訊的。

再來看一下我們目前程式的棧幀

繼續閱讀