幀指標和棧指標
阿新 • • 發佈:2018-11-01
幀指標和棧指標
2013年11月29日 14:24:41 HuntingGo 閱讀數:2743 標籤: linux作業系統 更多
個人分類: linux
原來幀指標指向的也是棧,不過是一個故事的開始。
而棧指標是一個故事的當下。
那幀指標為啥叫ebp,難道b==base。因為幀指標也叫基址指標。
幀指標使得訪問函式的引數很容易。
所以任何函式呼叫進來的第一件事都是保護呼叫者的幀指標,以使得返回時可以恢復呼叫者的幀指標。
------------------------------
函式呼叫的故事
1.各種引數入棧
2.返回地址入棧,這個是用當前指令地址++當作返回地址的
3.呼叫者的幀指標入棧保護(本次呼叫的基址指標就指向這裡)
4.呼叫者的暫存器入棧保護
5.被呼叫的函式的區域性變數的分配
依cpu不同會有細小的差別
函式呼叫時的記憶體佈局:
|-----引數----------|
|---返回地址--------|
|----舊的ebp--------| 新的ebp就會指向這裡
|---儲存的暫存器狀態|
|--本地變數---------|
所以當前ebp-4就是返回地址,當前ebp-8就是呼叫傳來的引數。
----------------------------
堆是可以建立很多個的,但是每個堆是有最大尺寸限制的。
記憶體有5種,堆,棧,靜態,常量,程式碼
全域性變數和靜態變數都在靜態記憶體裡。
常量字串都在常量區裡。
--------------------------------
緩衝區溢位對棧的破壞是顯而易見的,棧上的緩衝區溢位可以覆蓋返回地址,被惡意程式碼攻擊,也就誰說棧的緩衝區溢位很容易被利用,那麼堆上的緩衝區溢位危險不危險?