64位系統下程序的記憶體布局

2021-07-08 12:49:55 字數 1811 閱讀 1339

作業系統: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位系統的原因,我就我電腦虛擬機...