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 */
}