進程標示符
進程 id(PID)
父進程id(PPID)
進程位置
進程內存映像
Linux下C程序生成主要由四個步驟組成:預編譯、編譯、彙編、鏈接。編譯器gcc經過 預編譯、編譯、彙編3個步驟將源程序⽂文件轉換成目標文件。如果程序有多個目標文件或程 序中使用了庫函數,則編譯器還需要將所有目標文件及所需的庫文件鏈接起來,最後生成可執行程序。當程序執行時,操作系統將可執行程序複製到內存中,程序轉爲爲進程通常需要以下步驟:
*內核將程序讀入內存,爲程序分配內存空間;
*內核爲該進程保存PID及相應的狀態信息,把進程放到運行隊列中等待執行。程序轉化爲進程後就可被操作系統的調度程序執行了。進程的內存映像是指內核在內存中如何存放可執行程序文件。在將程序轉化爲進程的過程中,操作系統將可執行程序從硬盤複製至內存中,其佈局如下:
C地址空間測試代碼:
#include <stdio.h>
#include <stdlib.h>
int g_val = 100;
void test()
{
int a = 10;
int b = 10;
printf("test stack1 address : 0x%x\n", &a);
printf("test stack2 address : 0x%x\n", &b);
}
void(*fp)(); int main()
{
int a = 10;
int *heap = malloc(sizeof(int));
fp = test;
printf("code address : 0x%x\n", fp);
printf("data address : 0x%x\n", &g_val);
printf("heap address : 0x%x\n", heap);
printf("main stack0 address : 0x%x\n", &a);
fp();
return 0;
}
進程映像的位置依賴於使用的內存管理方案。
可執行程序與進程內存映像的不同之處在於:
a.可執行程序位於磁盤中而內存映像位於內存;
b.可執行程序沒有棧,因爲程序被加載到內在中才會分配堆棧;
c.可執行程序雖然也有未初始化數據段但它並不被存儲在位於硬盤中的可執行文中;
d. 可執行程序是靜態的、不變的,而內在映像隨着程序的執行是在動態變化的,比如數據段隨着程序的執行要存儲新的變量值,棧在函數調用時也是不斷在變化中。