C程序存儲空間佈局—各數據段的內存位置

原文地址:http://hi.baidu.com/peaksmile/item/7c31aa8b2e4dbb5826ebd9ad

從歷史上講,C程序一直由下面幾部分組成:

(1) 棧

由編譯器自動分配釋放管理。局部變量及每次函數調用時返回地址、以及調用者的環境信息(例如某些機器寄存器)都存放在棧中。新被調用的函數在棧上爲其自動和臨時變量分配存儲空間。通過以這種方式使用棧,C函數可以遞歸調用。遞歸函數每次調用自身時,就使用一個新的棧幀,因此一個函數調用實例中的變量集不會影響另一個函數調用實例中的變量。
a.局部變量
b.函數調用時返回地址
c.調用者的環境信息(例如某些機器寄存器)

(2) 堆

需要由程序員分配釋放管理,若程序員不釋放,程序結束時可能由OS(Operating System)回收。通常在堆中進行動態存儲分配。
如程序中的malloc, calloc, realloc等函數都從這裏面分配。堆是從下向上分配的。

(3) 非初始化數據段

通常將此段稱爲bss段,這一名稱來源於早期彙編程序的一個操作符,意思是“block started by symbol(由符號開始的塊)”,未初始化的全局變量和靜態變量存放在這裏。在程序開始執行之前,內核將此段初始化爲0。函數外的說明:long sum[1000] ; 使此變量存放在非初始化數據段中。
a.未初始化的全局變量
b.未初始化的靜態變量

(4) 初始化的數據

通常將此段稱爲數據段,它包含了程序中需賦初值的變量。初始化的全局變量和靜態變量存放在這裏。例如,C程序中任何函數之外的說明:int maxcount = 99; 使此變量以初值存放在初始化數據段中。
a.初始化的全局變量
b.初始化的靜態變量

(5) 正文段

CPU執行的機器指令部分。通常,正文段是可共享的,所以即使是經常環境指針環境表環境字符串執行的程序(如文本編輯程序、C編譯程序、s h e l l等)在存儲器中也只需有一個副本,另外,正文段常常是隻讀的,以防止程序由於意外事故而修改其自身的指令。
下面的內存結構顯示了這些段的典型安排:
下面給出一般的c程序存儲佈局的典型安排:
用戶空間的程序使用低2G的虛擬內存,內核空間使用高2G
高地址 ——0x7FFFFFFF———
命令行參數和環境變量
——————————
棧空間,向下增長
___________________
堆空間,向上增長
———————————
未初始化的數據
———————————
已初始化的數據
———————————
正文段
低地址—0x00000000————
C程序存儲空間佈局—各數據段的內存位置 - 六月的水 - 六月的水的博客
可以注意到未初始化的數據段的內容並不放在磁盤上的程序文件中,因爲,在程序開始運行前他們都被設置爲0。需要存放在程序文件中的只有正文段和初始化數據段。
參考:unix環境高級編程第二版p152

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章