C 應用程式記憶體結構

2021-10-13 13:07:08 字數 1396 閱讀 2518

bss段

bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

資料段

資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。**段是存放了程式**的資料,假如機器 中有數個程序執行相同的乙個程式,那麼它們就可以使用同乙個**段。

堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時, 新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變 量)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以 棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

什麼是bbs

bss是「block started by symbol」的縮寫,意為「以符號開始的塊」。

bss是unix鏈結器產生的未初始化資料段。其他的段分別是包含程式**的「text」段和包含已初始化資料的「data」段。 bss段的變數只有名稱和大小卻沒有值。此名後來被許多檔案格式使用,包括pe。「以符號開始的塊」指的是編譯器處理未初始化資料的地方。bss節不包含 任何資料,只是簡單的維護開始和結束的位址,以便記憶體區能在執行時被有效地清零。bss節在應用程式的二進位制映象檔案中並不存在。

在採用段式記憶體管理的架構中(比如intel的80x86系統),bss段(block started by symbol segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,一般在初始化時bss 段部分將會清零。bss段屬於靜態記憶體分配,即程式一開始就將其清零了。

比如,在c語言之類的程式編譯完成之後,已初始化的全域性變數儲存在.data 段中,未初始化的全域性變數儲存在.bss 段中。

text和data段都在可執行檔案中(在嵌入式系統裡一般是固化在映象檔案中),由系統從可執行檔案中載入;而bss段不在可執行 檔案中,由系統初始化。

linux應用程式記憶體布局

對向高記憶體位址生長,棧想低記憶體位址生長 linux中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。第二行是資料段的記憶體位址範圍。第三行是堆的記憶體位址範圍。最後一...

《C 應用程式效能優化》之程式記憶體

乙個程式占用的記憶體區通常分5種,如下 全域性 靜態資料區 儲存全域性變數和靜態變數 常量資料區 儲存程式中的常量 字串等,不可修改 區 儲存 資料 棧 儲存自動變數 區域性變數,傳遞引數 堆 使用者控制的儲存區,儲存動態產生的資料 程式在分配記憶體時為了加快訪問速度,採取的一種分配策略。每個特定平...

C 應用程式域

在作業系統中,程式和程式之間應實現某種形式的隔離,防止程式和程式之間產生不可預知的影響,這種隔離是必須的。在dotnet技術之前,通常採用程序來形成隔離邊界。每乙個應用程式被載入到單獨的程序中,每個程序都有其私有的記憶體,執行在乙個程序中的應用程式不能寫入另乙個應用程式的記憶體,您也不能在兩個程序間...