1. 程式人生 > >程序存儲器分段

程序存儲器分段

當前 先進後出 tro 程序 heap 重新 一段 分段 flag

程序存儲器分為:text,data,bss,heap,stack

text:代碼段,存儲匯編後程序機器語言指令,該段內執行是非線性的。text段禁用寫權限。

data:存儲程序運行過程中要使用的全局變量,字符串和其他常量。

bss:存儲未初始化的內容。

heap:heap段的大小是可變的。heap段中的所有存儲單元又配器和回收器算法管理。分配器在堆中預留一部分區域,回收器取消預留的存儲器,使該區域可以被下一次預留重新使用。堆從存儲器的低地址向高地址增長。

stack(先進後出):stack段的大小是可變的。stack段用作中間結果暫存器來存儲斷點信息。當一個程序運行時,函數將有它自己的傳遞變量集,並且函數的代碼會在文本段(代碼段)的不同存儲單元內。函數調用時,程序的運行環境和EIP必須改變,堆棧存儲所有被傳遞的變量,以及函數執行後EIP應該返回的地方。數據被存入堆棧中時成為壓棧(Push),數據取出被稱為出棧(POP).

void test_function(int a,int b,int c,int d)
{
char flag;
char buffer[10];      
}

void main()
{
    test_function(1,2,3,4);
}

這一段代碼聲明了一個具有4個參數的test函數。

當主函數調用時,值被壓入堆棧以創建下述堆棧幀。當調用test_function()時,逆序將函數壓入堆棧,函數的參數是1,2,3,4,因而隨後的壓棧指令壓入4,3,2,1.

當匯編call執行執行時,為了將執行環境變成test_function(),返回地址被壓入堆棧。這個值是緊跟在當前EIP之後的那一條指令。

緊隨返回地址的是幀指針,這個值用來恢復EBP原來的值。然後,把ESP的值復制到EBP中。

技術分享圖片

當函數調用時,EIP的值被修改為函數在代碼段中的首地址,以執行函數。

函數執行結束時,EIP被設置為返回地址。

技術分享圖片

程序存儲器分段