[轉帖]簡單解讀linux的/proc下的statm、maps、memmap 記憶體資訊檔案分析【轉】

济南小老虎發表於2024-05-23

轉自:https://blog.csdn.net/sctq8888/article/details/7398776

複製程式碼
轉載自:http://hi.baidu.com/deep_pro/blog/item/5a9d5b9487b23314d31b7079.html

簡單解讀linux的/proc下的statm、maps、memmap 記憶體資訊檔案分析

 * cmdline: 啟動程序的命令和引數。
* cwd: 指向程序當前目錄的一個連線。
* environ: 程序所有的環境變數。
* fd: 程序所有開啟的檔案描述符,目錄下是一個個以數字為名稱的連線,指向了程序當前正在使用的檔案。
* maps, statm, mem: 程序的記憶體資訊。
* stat, status: 程序的狀態資訊,比如檢視 /proc/status 中是否含有 “Zombie”字樣,來檢視殭屍程序。

幾乎看什麼核心漏洞分析之類的文章,第一眼都是被 cat /proc/{pid}/maps
產生的一堆奇怪的資訊唬住了,都不敢往下看
居然沒有搜到關於它們的詳細介紹,旁邊也沒有表頭什麼的解釋資訊
那就我來整理一下吧,方便後人

ls /proc 能看到一些數字命名的資料夾,這個就不多說了,什麼pid、fd的知識還是容易弄到的
拿init開刀,
[root@localhost proc]# cat /proc/1/statm
487 185 133 31 0 67 0

很簡單地返回7組數字,每一個的單位都是一頁 (常見的是4KB)
分別是
size:任務虛擬地址空間大小
Resident:正在使用的實體記憶體大小
Shared:共享頁數
Trs:程式所擁有的可執行虛擬記憶體大小
Lrs:被映像倒任務的虛擬記憶體空間的庫的大小
Drs:程式資料段和使用者態的棧的大小
dt:髒頁數量

接下來看看maps
[root@localhost proc]# cat /proc/1/maps
00110000-00111000 r-xp 00110000 00:00 0          [vdso]
0032b000-00347000 r-xp 00000000 fd:00 852733     /lib/ld-2.8.so
00347000-00348000 r--p 0001c000 fd:00 852733     /lib/ld-2.8.so
00348000-00349000 rw-p 0001d000 fd:00 852733     /lib/ld-2.8.so
0034b000-004ae000 r-xp 00000000 fd:00 852734     /lib/libc-2.8.so
004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
004b0000-004b1000 rw-p 00165000 fd:00 852734     /lib/libc-2.8.so
004b1000-004b4000 rw-p 004b1000 00:00 0
08048000-08067000 r-xp 00000000 fd:00 843075     /sbin/init
08067000-08068000 rw-p 0001e000 fd:00 843075     /sbin/init
08b42000-08b6a000 rw-p 08b42000 00:00 0          [heap]
b8046000-b8048000 rw-p b8046000 00:00 0
bfb4e000-bfb63000 rw-p bffeb000 00:00 0          [stack]

一共有6列
第一列代表記憶體段的虛擬地址
第二列代表執行許可權,r,w,x不必說,p=私有 s=共享
不用說,heap和stack段不應該有x,否則就容易被xx,不過這個跟具體的版本有關
第三列代表在程序地址裡的偏移量
第四列對映檔案的主裝置號和次裝置號
透過 cat /proc/devices
得知fd是253 device-mapper

第五列映像檔案的節點號,即inode

第六列是映像檔案的路徑
以前我很奇怪怎麼會有兩個相同的檔案路徑,原來
08048000-08067000 r-xp 00000000 fd:00 843075     /sbin/init
08067000-08068000 rw-p 0001e000 fd:00 843075     /sbin/init
一個是隻讀的,是程式碼段,一個是讀寫的,是資料段
至於為什麼共享庫分成了三個
0034b000-004ae000 r-xp 00000000 fd:00 852734     /lib/libc-2.8.so
004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
004b0000-004b1000 rw-p 00165000 fd:00 852734     /lib/libc-2.8.so
其中的004ae000-004b0000 r--p 00163000 fd:00 852734     /lib/libc-2.8.so
還是不能理解

最後看看神秘的memmap
可惜不是所有的版本都有這個檔案,如同我這裡的情況
只有口頭說一說了,memmap需要和maps配合看
顯示出來的每一行代表maps裡的一個段
每一行的每一個數字,代表那個段裡的一個頁,段有多大,一行就有對應的多少個數字

如果這個數字是0,代表系統為其分配了虛擬記憶體,但是沒有分配實體記憶體
如果有數字,則代表系統為其分配了實體記憶體,以及有多少個程序引用了這個頁
當然,不會有負數出現

相關文章