C程序-進程內存結構分析

  

  1. 每一個進程都運行在本身私有的內存空間中(即虛擬地址空間)。在32位系統中,4GB的進程地址東健被分爲用戶空間和內核空間兩個部分。用戶空間佔據着0~3GB(用16進製表示爲0xC0000000),而內核空間的範圍是3GB~4GB。對於一個進程而言,都會涉及3種不一樣的數據段,分別是代碼段、數據段和堆棧段。html

  代碼段:用於保存可執行文件的操做指令和程序定義的常量。爲了防止代碼在運行的時候被其餘進程修改,代碼段將只容許讀取,不能進行修改。多進程可以共享相同的代碼段,即當程序被屢次執行時,運行的相同程序將共享代碼段。linux

  數據段:其位置緊接着代碼段,分爲初始化數據段和未初始化數據段(也稱爲BSS段)。初始化代碼段用於存放已經初始化的全局變量和程序的靜態變量,而未初始化數據段用於保存未初始化的全局變量。函數

  堆棧段:堆棧段的堆用於存放進程中動態分配的內存地址。例如,在C語言中使用malloc函數、在C++中使用new函數分配的內存空間都將在堆中分配。當使用free函數或delete函數釋放內存時,分配的內存將從堆中刪除。棧用於保存程序中建立的臨時變量。函數調用時,傳遞的參數也將被保存在棧中。在函數調用結束後,其返回值也將保存在棧中。棧具備先進先出的特色,適用於保存和恢復現場。能夠將棧看做用於存放臨時數據、進行數據交換的內存區域。棧的大小受操做系統的限制,所以從棧中得到的空間大小有限,而堆的大小隻是受限於虛擬內存空間,所以使用堆能夠得到較大的內存空間。堆的位置與數據段相鄰。spa

  2. 代碼操作系統

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 
 6 int etext,edata,end;//
 7 
 8 //g_pstr和g_buffer都爲全局變量,只是一個初始化,一個未初始化
 9 char *g_pstr="Global string\n";
10 char g_buffer[20];
11 
12 inline void disp_addr(char * p,int addr)
13 {
14     printf("Name :%s  Address :%0x\n",p,addr);
15 }
16 
17 void disp_var(char* p)
18 {
19     char *buffer1;
20     disp_addr("buffer1 address:",(int)(&buffer1));
21     buffer1=(char*)malloc(strlen(p)+1);
22     strcpy(buffer1,p);
23     printf("buffer1 : %s\n",buffer1);
24     free(buffer1);
25 }
26 
27 int main()
28 {
29     int i=0;
30 
31     //以十六進制顯示
32     printf("Addr etext :%p\n",&etext);
33     printf("Addr edata :%p\n",&edata);
34     printf("Addr end   :%p\n",&end);
35 
36     //顯示各個函數和變量地址
37     disp_addr("  function main()  :",(int)(main));
38     disp_addr("function disp_var():",(int)(disp_var));
39     disp_addr("   g_pstr address  :",(int)(&g_pstr));
40     disp_addr(" g_buffer address  :",(int)(&g_buffer));
41     disp_addr("   i address       :",(int)(&i));
42 
43     disp_var(g_pstr);
44     return 0;
45 }

 

  3. 運行結果code

Addr etext :0x8049954
Addr edata :0x8049958
Addr end   :0x8049950
Name :  function main()  :,Address :804850c
Name :function disp_var():,Address :80484a7
Name :   g_pstr address  :,Address :8049930
Name : g_buffer address  :,Address :804993c
Name :   i address       :,Address :bf8583ec
Name :buffer1 address:,Address :bf8583bc
buffer1 : Global string

 

  4. 圖示htm

 

  5.用戶空間到0xC0000000-0xBFB18CAC = 棧的大小  blog

   在VC或VS中好像是使用 #pragma comment(linker, "/STACK:1024000000,1024000000")進程

   至於linux 下就不太清楚了內存

 

 

  出處:http://www.cnblogs.com/wunaozai/p/3636771.html

相關文章
相關標籤/搜索