名稱 | 內(nèi)容 |
代碼段 | 可執(zhí)行代碼、字符串常量 |
數(shù)據(jù)段 | 已初始化全局變量、已初始化全局靜態(tài)變量、局部靜態(tài)變量、常量數(shù)據(jù) |
BSS段 | 未初始化全局變量,未初始化全局靜態(tài)變量 |
棧 | 局部變量、函數(shù)參數(shù) |
堆 | 動態(tài)內(nèi)存分配 |
(1)代碼段(text segment):存放CPU執(zhí)行的機器指令。通常代碼段是可共享的,這使得需要頻繁被執(zhí)行的程序只需要在內(nèi)存中擁有一份拷貝即可。代碼段也通常是只讀的,這樣可以防止其他程序意外地修改其指令。另外,代碼段還規(guī)劃了局部數(shù)據(jù)所申請的內(nèi)存空間信息。
代碼段(code segment/text segment)通常是指用來存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于只讀, 某些架構(gòu)也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量等。
(2)數(shù)據(jù)段(data segment):或稱全局初始化數(shù)據(jù)段/靜態(tài)數(shù)據(jù)段(initialized data segment/data segment)。該段包含了在程序中明確被初始化的全局變量、靜態(tài)變量(包括全局靜態(tài)變量和局部靜態(tài)變量)和常量數(shù)據(jù)。
(3)未初始化數(shù)據(jù)段:亦稱BSS(Block Started by Symbol)。該段存入的是全局未初始化變量、靜態(tài)未初始化變量。
而當程序被加載到內(nèi)存單元時,則需要另外兩個域:堆域和棧域。
(4)棧段(stack):存放函數(shù)的參數(shù)值、局部變量的值,以及在進行任務(wù)切換時存放當前任務(wù)的上下文內(nèi)容。
(5)堆段(heap):用于動態(tài)內(nèi)存分配,即使用malloc/free系列函數(shù)來管理的內(nèi)存空間。
在將應(yīng)用程序加載到內(nèi)存空間執(zhí)行時,操作系統(tǒng)負責(zé)代碼段、數(shù)據(jù)段和BSS段的加載,并將在內(nèi)存中為這些段分配空間。棧段亦由操作系統(tǒng)分配和管理,而不需要程序員顯示地管理;堆段由程序員自己管理,即顯示地申請和釋放空間。
另外,可執(zhí)行程序在運行時具有相應(yīng)的程序?qū)傩浴T谟胁僮飨到y(tǒng)支持時,這些屬性頁由操作系統(tǒng)管理和維護。
下面給出示例程序代碼,注釋已經(jīng)在代碼中寫明:
新聞熱點
疑難解答
圖片精選