1. 程式人生 > 其它 >linux程式各種型別的資料在記憶體中存放的位置分佈

linux程式各種型別的資料在記憶體中存放的位置分佈

一直以來都對程序在計算機記憶體中的存放位置比較模糊,這次索性查閱資料,總結後畫個草圖方便理解。

畫圖思路主要從記憶體劃分、記憶體分配方式入手。

1.記憶體劃分:

①核心:linux的核心記憶體管理是一個比較複雜的部分,建議將此部分單獨拎出來分析,這裡不做分析,可參考https://blog.csdn.net/haidao2009/article/details/8973484 理解。

②棧區(自動分配):棧區可以說是程式執行中最常用,呼叫最頻繁的區域,該區域主要存放自動區域性變數、函式形參、命令列引數、環境變數。該區的特點是資料以高地址優先方式儲存(方便釋放,提高空間利用效率),在該區未初始化的變數預設值為垃圾值,故最好在定義 時就初始化。該區變數生命週期為一個函式內(準確來說是一個花括號{}內)。

③資料段(靜態區):該區也為自動分配方式,主要用來存放全域性變數、靜態區域性變數、常量。該區域可再細分為兩個小區,一個未初始化區,一個初始化區,不同於棧區,在該去未初始化的變數預設值將為0,而不是垃圾值;且在未初始化區資料以高地址優先方式儲存,在初始化區資料以低地址優先方式儲存。生命週期為整個程式執行期間。

④堆區(動態分配):該區空間由使用者分配,使用者釋放,一般用malloc()、calloc()函式來分配空間,用free()函式來釋放空間。注意:該區的空間若只分配而未釋放則該部分空間會一直被佔用,直到裝置關機重啟,為防止程式、裝置奔潰,分配空間用完後記得釋放。

⑤程式碼段:該區主要存放使用者程式碼(.txt)、系統初始化程式碼(.init),注意該區的記憶體為只讀方式(保護資料)。

⑥不可訪問區:此部分為硬體相關部分,不做分析。

Talk is cheap, show me the code