程式儲存器的分段

chaosky發表於2013-05-11

程式儲存器分為5段:text、data、bss、heap和stack段。每一段代表為某一特定目的預留的一塊專用儲存區。
text段有時又稱為程式碼段。程式碼段是儲存彙編後程式的機器語言指令的地方。由於高階控制結構和函式將被編譯成組合語言的分支、跳轉和呼叫指令,因而該段內指令的執行是非線性的。當程式執行時,EIP(擴充套件指令指標)被設定為text段的第一條指令。然後處理器按照迴圈做下面的事情:

  1. 讀EIP指向的指令。
  2. EIP增加指令的位元組長度
  3. 執行第1步讀取的指令。
  4. 跳轉到第1步。

text段禁用寫許可權,因為該段不用來儲存變數,而只用來儲存程式碼。這實際上可以防止人們修改程式程式碼。該段為只讀的另一個優點是:可被程式的不同副本所共享,使同時執行程式多次不出現任何的問題。還應該注意,這一儲存段有固定的大小,因為在它裡面沒有什麼可改變。

data段和bss段用來儲存全域性和靜態程式變數。 data段中充滿了整個程式執行過程中都要使用的已經初始化的全域性變數、字串和其他變數。bss段充滿了相應的未初始化的內容。雖然這些段是可以修改的,但它們也有固定的大小。

heap段用來儲存程式的其他變數。 關於heap段值得注意的一點是其大小是可變的,即堆的大小可以根據需要而變大或變小。heap段中的所有儲存單元由分配器和回收器演算法所管理。分配器在堆中為使用預留一部分儲存區域,而回收器取消預留的儲存區域,使該區域可以被下一次預留重新使用。堆的增大和縮小取決於預留使用的儲存區域的大小。堆從儲存器的低地址向高地址增長。

stack段的大小也是可變的,並且在函式呼叫時,stack段被用作中間結果暫存器來儲存斷點資訊。當一個程式呼叫函式時,函式將它自己的傳遞變數集,並且函式的程式碼會在文字(或程式碼)段的不同儲存單元內。由於在呼叫函式時,程式的執行環境和EIP必須改變,因而用堆疊儲存所有被傳遞的變數,以及函式執行後EIP應該返回的地方。

相關文章