(1)記憶體組成
(2)記憶體布局
linux所有應用程式都是從0x80480000開始,
其中0x80480000是乙個虛擬位址
1)下面來測試一下應用程式的位址分布
#include
#include
int global_init_a=1;
//全域性的,初始化的變數 : 資料段
int global_uninit_a;
//全域性的,沒有初始化的變數 : 資料段
static int static_global_init_a = 1; //全域性的,靜態的,初始化的變數 : 資料段
static int static_global_uninit_a; //全域性的,靜態的,未初始化的變數 : 資料段
const int const_global_a = 1; //全域性的,常量
: **段
int global_init_b=1;
//全域性的,初始化的變數 : 資料段
int global_uninit_b;
//全域性的,沒有初始化的變數 : 資料段
static int static_global_init_b = 1; //全域性的,靜態的,初始化的變數 : 資料段
static int static_global_uninit_b; //全域性的,靜態的,未初始化的變數 : 資料段
const int const_global_b = 1; //全域性的,常量 : **段
int main(void)
2) 編譯並執行程式,這裡不過多介紹
3) 另開起乙個終端
ps -axu 檢視系統所有程序,找到我們剛才執行的程式./addr
cat /proc/程序pid/maps 檢視記憶體分布情況
結果如下:
兩張圖的位址段對比就可以知道程式中的變數在記憶體中如何存放的!
已經將對比的結果寫到程式的注釋中了.
4)bss段去**了?
1>首先檢視程式的格式 file addr
由此可知應用程式addr是elf屬性的檔案
2> 使用readelf -s addr 來檢視bss的位址段
由此可知bss(未初始化的資料段):
全域性未初始化的變數(靜態的,非靜態的)
區域性未初始化的變數(靜態的)
另一種方法:(就是麻煩點
先判斷出所有變數的分布,再找出未初始化的資料段的變數,即屬於bss段
5)總結:
5. bss段:
全域性未初始化的變數(靜態的,非靜態的)
區域性未初始化的變數(靜態的)
Linux 應用程式的位址空間分布
linux 應用程式在被核心調入記憶體中執行後就成為乙個程序,因此分析應用程式的位址空間實際上就是分析程序的位址空間分布。應用程式的位址空間實際上由以下幾個部分組成 段 初始化資料段 未初始化資料段 bss段 堆 棧。其在記憶體中的分布如下 apue給出了各個段所包含內容的詳細介紹,這裡筆者用乙個比...
應用程式中的位址分布
全域性,初始化 資料段 全域性,未初始化 資料段 全域性,靜態,初始化 資料段 全域性,靜態,未初始化 資料段 全域性,常量 段 區域性,初始化 棧 區域性,未初始化 棧 區域性,靜態,初始化 資料段 區域性,靜態,未初始化 資料段 區域性,常量 棧 malloc分配 堆 分為區域性 全域性,區域性...
Linux 1 4 應用程式位址布局
1 記憶體組成 2 記憶體布局 linux所有應用程式都是從0x80480000開始,其中0x80480000是乙個虛擬位址 1 下面來測試一下應用程式的位址分布 include include int global init a 1 全域性的,初始化的變數 資料段 int global unini...