程序映像
現在我們已經瞭解瞭如何獲取程序及其父程序的基本資訊,現在是時候深入瞭解程序/程式資訊的細節了。
什麼是程序映像?程序映像是執行程式時所需的可執行檔案。此映像通常包含以下部分:
- 程式碼段或文字段
- 資料段
- 棧段
- 堆段
以下是程序映像的圖形表示。
程式碼段是目標檔案或程式虛擬地址空間的一部分,包含可執行指令。這通常是隻讀資料段,並且大小固定。
資料段分為兩種型別。
- 已初始化
- 未初始化
已初始化資料段是目標檔案或程式虛擬地址空間的一部分,包含已初始化的靜態和全域性變數。
未初始化資料段是目標檔案或程式虛擬地址空間的一部分,包含未初始化的靜態和全域性變數。未初始化資料段也稱為 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