linux 程序記憶體管理 資料段

2021-08-20 07:21:18 字數 1816 閱讀 1785

所有程序(執行的程式)都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式**,或是存放取自使用者輸入的資料等等。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。

·**段

這個區域儲存著被裝入執行的二進位制機器**,處理器會到這個區域取指並執行。

**段需要防止在執行時被非法修改,所以只准許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

·資料段:又稱

全域性初始化資料區/靜態資料區(initialized data segment/data segment)。該區包含了在程式中明確被初始化的全域性變數、靜態變數(包括全域性靜態變數和區域性靜態變數)和常量資料(如字串常量)。

·bss段

:未初始化資料區。亦稱bss區(uninitialized data segment),存入的是全域性未初始化變數。bss這個叫法是根據乙個早期的彙編運算子而來,這個彙編運算子標誌著乙個塊的開始。bss區的資料在程式開始執行之前被核心初始化為0或者空指標(null)。

bss段和資料段區別:

int a;

static int b;

int c = 1;

static int d = 1;

int main()

執行結果:

a:0x100407000    //未初始化 全域性變數

b:0x100407008    //未初始化 全域性靜態變數

e:0x10040700c    //未初始化 區域性靜態變數

c:0x100402010    //初始化    全域性變數

d:0x100402014   //初始化    全域性靜態變數

f:0x100402018    //初始化    區域性靜態變數

g:0xffffcbfc         //區域性變數

由上可以看出:

資料段:用來存放可執行檔案中已初始化全域性變數,換句話說就是存放已初始化的靜態變數(包括全域性和區域性)和已初始化全域性變數。

bss段:用來存放程式中未初始化的全域性變數,也就是未初始化靜態變數(包括全域性和區域性)和未初始化全域性變數,在記憶體中bss段全部置零。

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

·棧

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

如下圖所示為linux下編譯後的可執行**和載入記憶體後程序的記憶體布局:

圖1 編譯後的可執行檔案記憶體布局

圖2 載入記憶體後程序的記憶體布局

再來看一張圖,多個乙個命令列引數區:

深入理解 參考 

linux 段頁記憶體管理介紹

linux中cpu給出虛擬位址轉換到實體地址的過程以及訪存次數 快表存在時邏輯位址到實體地址的轉換過程 1.在cpu給出有效位址後,由位址變換機構自動地將頁號p送入高速緩衝暫存器 也會使用到段號 並將此頁號與快取記憶體中的所有頁號進行比較,若其中有與此相匹配的的頁號,便表示所要訪問的頁表項在快表中 ...

Linux記憶體管理2 段機制

本文將主要以x86架構為例來介紹linux記憶體管理的段機制。段的保護屬性 表示段的特性。例如該段是否可以被讀出或寫入。或者該段是否可以作為乙個程式來執行,以及段的特權等級 圖 段描述符的一般格式 圖 段描述符表 段表 索引描述虛擬位址空間段的編號 基位址是線性位址空間段的起始位址 補充 保護模式下...

linux 環境變數(linux程序記憶體管理)

資料的內部儲存 大端 低位址存高位數 小端 高位址存高位數 段 乙個程式多數情況下是不需要更改自身 的,只有一種情況例外,就是一些長時間執行的公升級程式。另一種解決方案為採用共享庫的形式 資料段 包含程式中明確給定初值的全域性變數和靜態變數。緩衝段 通常是沒有明確給定初值的全域性變數和靜態變數。棧 ...