轉自: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,代表系統為其分配了虛擬記憶體,但是沒有分配實體記憶體 如果有數字,則代表系統為其分配了實體記憶體,以及有多少個程序引用了這個頁 當然,不會有負數出現