Stack Frame

What is stack frame?

當我們呼叫一個函數時,這個函數會需要一些記憶體來記錄一些資訊,像是 local variable 和 passed parameters 之類的,而 stack frame 就是這個地方

stack frame 長在 virtual memory 的 stack 上面,每次我們呼叫一個函數就會在 stack 上 push 一塊新區域,而當我們 return 後則會 pop 掉

我們有一個 pointer 來記錄現在最上層的 stack frame 目前的位置,當函數 return 時,pointer 就會指到上一個 stack frame

What is inside a stack frame?

Returned Address

當這個函數 return 時,會需要回到他的 caller 處繼續執行,因此我們需要紀錄 caller 對應的 instruction 在 text segment 所在的位置

Passed Parameters

我們呼叫函數時會傳遞一些參數,這些參數就儲存在這裡

Saved Registers

CPU 的暫存器數量有限,當函數開始執行時,它可能需要使用某些暫存器。為了不破壞呼叫者正在使用的資料,函數會先把這些暫存器的值保存到 stack 上,等函數返回前再恢復。這就像你借用別人的工作檯時,先把對方的東西收到一邊,用完後再放回原位

Local Variables

嗯… 就函數宣告的 local variables

Local variable should never be referenced after returned

在下面這段程式碼中,雖然剛 return 時 databuf 還能正常使用,但是當呼叫新的函數時,這塊 stack 上的記憶體就會被覆蓋,我們再繼續訪問不是造成 fp 出問題就是新的函數執行時會出問題

#define DATAFILE "datafile"
 
FILE *
open_data(void)
{
    FILE *fp;
    char databuf[BUFSIZ]; /* setvbuf makes this the stdio buffer */
 
    if ((fp = fopen(DATAFILE, "r")) == NULL)
        return (NULL);
    if (setvbuf(fp, databuf, _IOLBF, BUFSIZ) != 0)
        return (NULL);
    return (fp); /* error */
}