作業系統:ubuntu15.04
物理記憶體:4g
#include
#include
int a;
int b=1;
main()
}
以下2種方式可以結合著觀察
1、pmap 命令
pmap [引數] [程序pid]
引數:
執行測試程式,用top或ps 命令查詢程序pid:
屬性含義
address
kbytes
大小mode
許可權:r可讀、w可寫、x可執行、s共享記憶體、p私有記憶體
offset
虛擬記憶體偏移量
device
所在裝置(主:次): 008:00008表示sda8
虛擬記憶體分配大小
shared
共享記憶體大小
mem 是執行程式的名字
.so 是使用的動態鏈結庫
stack 使用的棧空間
anon 預分配的虛擬記憶體,還未有資料占用
2、檢視 /proc/pid號/maps 檔案內容
這個要比上面顯示的更詳細一點
第1行 [可讀可執行] 是程式的文字段
第2行 [唯讀]………….不清楚
第3行 [可讀可寫] 是程式的資料段(包括初始化資料段和未初始化資料段)
第4行 ………………..堆空間
第16行 ………………棧空間
vdso 和 vsyscall ……………系統的快速呼叫
用 ls -i 可檢視原始檔的inode,符合第5列;鏈結庫在根分割槽下,我的是sda8,源程式在home下,我的是sda8,符合第4列。
3、程式的執行結果
從程式的入口位址main 0x400586 可以看出,maps檔案的第一行確實是程式的**段。
全域性變數(初始化和未初始化)位於資料段,對應第3行
區域性變數位於棧段
const 常量位於棧段
常字串位於文字段
動態申請記憶體位於堆段
64位系統中應該有48根位址匯流排,低位:0~47位才是有效的可變位址,高位:48~63位全補0或全補1。一般高位全補0對應的位址空間是使用者態,如上面的第1~18行。高位全補1對應的是核心態,如上面的第19行。這64位的位址空間並不能全部被使用(太多了),所以使用者態和核心態之間會有未使用的空間(據說叫amd64空洞)。由上圖的檔案內容可以看出,從低位址到高位址記憶體布局依次是:
保留區 –> 文字段–>資料段—>堆—>共享庫—>棧–>環境變數—>核心態
由pmap 命令和maps的顯示可看出,棧和堆的中間部分是共享庫,棧空間位址減小向下增長,堆空間位址增大向上增長。我覺得堆疊增長的時候,資料會先往緊挨的已分配記憶體anon中放,anon不夠用時再繼續增長,新分配記憶體。
顯示系統啟動時的資訊
dmesg鏈結
linux系統程序的記憶體布局
文章 記憶體管理模組是作業系統的心臟 它對應用程式和系統管理非常重要。今後的幾篇文章中,我將著眼於實際的記憶體問題,但也不避諱其中的技術內幕。由於不少概念是通用的,所以文中大部分例子取自32位x86平台的linux和windows系統。本系列第一篇文章講述應用程式的記憶體布局。在多工作業系統中的每乙...
64位系統最大支援多少記憶體
32位 系統能夠識別的記憶體最大在3.25 3.5gb左右,也就是說4gb的記憶體條有0.5gb左右用不了。2gb記憶體條或者2gb 1gb記憶體條用32位系統絲毫沒有影響。64位 對於64位系統的windows 7,最大記憶體支援就要視不同的系統版本而定了。比如,windows 7 home ba...
VS下編譯在64位系統下能用的32位系統
最近感覺電腦慢了,也為了嘗鮮64位系統,就安裝了乙個windows7的64位系統。有天有人報告我的寫的小工具有個小問題,我快速檢視了 並修正問題並重新編譯後執行卻發現在64位下無法正常執行,報錯總稱無法載入sharpsvn.dll,當時百思不得其解,感覺可能是因為我64位系統的原因,我就我電腦虛擬機...