程序映像



現在我們已經瞭解瞭如何獲取程序及其父程序的基本資訊,現在是時候深入瞭解程序/程式資訊的細節了。

什麼是程序映像?程序映像是執行程式時所需的可執行檔案。此映像通常包含以下部分:

  • 程式碼段或文字段
  • 資料段
  • 棧段
  • 堆段

以下是程序映像的圖形表示。

Process Images

程式碼段是目標檔案或程式虛擬地址空間的一部分,包含可執行指令。這通常是隻讀資料段,並且大小固定。

資料段分為兩種型別。

  • 已初始化
  • 未初始化

已初始化資料段是目標檔案或程式虛擬地址空間的一部分,包含已初始化的靜態和全域性變數。

未初始化資料段是目標檔案或程式虛擬地址空間的一部分,包含未初始化的靜態和全域性變數。未初始化資料段也稱為 BSS(以符號開始的塊)段。

資料段是讀寫段,因為變數的值可以在執行時更改。此段的大小也是固定的。

棧段是為自動變數和函式引數分配的記憶體區域。它還在執行函式呼叫時儲存返回地址。棧使用 LIFO(後進先出)機制來儲存區域性或自動變數、函式引數以及儲存下一個地址或返回地址。返回地址是指函式執行完成後返回的地址。此段的大小根據區域性變數、函式引數和函式呼叫的不同而變化。此段從高地址向低地址增長。

堆段是為動態記憶體儲存分配的記憶體區域,例如 malloc() 和 calloc() 呼叫。此段的大小也根據使用者分配的不同而變化。此段從低地址向高地址增長。

現在讓我們檢查一下幾個示例程式中段(資料段和 bss 段)的大小是如何變化的。段的大小可以透過執行命令“size”來得知。

初始程式

檔案:segment_size1.c

#include<stdio.h>

int main() {
   printf("Hello World\n");
   return 0;
}

在以下程式中,添加了一個未初始化的靜態變數。這意味著未初始化段(BSS)的大小將增加 4 位元組。注意 - 在 Linux 作業系統中,int 的大小為 4 位元組。整數資料型別的 size 取決於編譯器和作業系統的支援。

檔案:segment_size2.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   printf("Hello World\n");
   return 0;
}

在以下程式中,添加了一個已初始化的靜態變數。這意味著已初始化段(DATA)的大小將增加 4 位元組。

檔案:segment_size3.c

#include<stdio.h>

int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

在以下程式中,添加了一個已初始化的全域性變數。這意味著已初始化段(DATA)的大小將增加 4 位元組。

檔案:segment_size4.c

#include<stdio.h>

int myglobalint1 = 500;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

在以下程式中,添加了一個未初始化的全域性變數。這意味著未初始化段(BSS)的大小將增加 4 位元組。

檔案:segment_size5.c

#include<stdio.h>

int myglobalint1 = 500;
int myglobalint2;
int main() {
   static int mystaticint1;
   static int mystaticint2 = 100;
   printf("Hello World\n");
   return 0;
}

執行步驟

編譯

babukrishnam $ gcc segment_size1.c -o segment_size1
babukrishnam $ gcc segment_size2.c -o segment_size2
babukrishnam $ gcc segment_size3.c -o segment_size3
babukrishnam $ gcc segment_size4.c -o segment_size4
babukrishnam $ gcc segment_size5.c -o segment_size5

執行/輸出

babukrishnam size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
   text  data  bss  dec  hex  filename
   878   252    8   1138 472  segment_size1 
   878   252   12   1142 476  segment_size2 
   878   256   12   1146 47a  segment_size3 
   878   260   12   1150 47e  segment_size4 
   878   260   16   1154 482  segment_size5
babukrishnam
廣告

© . All rights reserved.