简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析

转载 2012年03月27日 14:20:16

转载自: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,代表系统为其分配了虚拟内存,但是没有分配物理内存
如果有数字,则代表系统为其分配了物理内存,以及有多少个进程引用了这个页
当然,不会有负数出现


查看进程所占内存/proc/[pid]/statm踩坑记

需求:杀掉内存占用较高的进程。解决方法:读取进程的/proc/[pid]/statm,取第二个值作为进程使用的内存。...
  • dutsoft
  • dutsoft
  • 2016年04月26日 14:44
  • 3542

/proc/[pid]/下的maps、status、stat、statm

/proc/[pid]/maps 文件解释 查看进程的虚拟地址空间是如何使用的。  该文件有6列,分别为:  地址:库在进程里地址范围 权限:虚拟内存的权限,r=读,w=写,x=,s=共享...
  • koozxcv
  • koozxcv
  • 2016年03月23日 09:56
  • 803

【Linux启动命令行】介绍memmap

mem=nn[KMG] [KNL,BOOT] Force usage of a specific amount of memory ...
  • maray
  • maray
  • 2010年12月30日 17:33
  • 5794

MemMap内存映射

一、内存映射文件是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保...

linux 中查看某个单进程程序运行所占内存(linux proc status statm详解)

linux 中查看某个单进程程序运行所占内存(linux proc status statm详解) 本文来自:http://www.lifecrunch.biz/archives/216 转载自品...
  • mal327
  • mal327
  • 2011年08月21日 09:31
  • 8147

mmap。

linux mmap 内存映射 mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2()。系统调用mmap()...
  • ryder001
  • ryder001
  • 2012年09月11日 10:40
  • 16966

linux内核内存管理学习之二(物理内存管理--伙伴系统)

linux使用伙伴系统来管理物理内存页。 一、伙伴系统原理 1. 伙伴关系 定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块...

Linux下将物理地址映射到用户空间

/************************************************************/ /* file name : memmap.c ...

Linux下内存映射文件的用法简介

由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。              简介:         内存映射文件与虚拟内存有...
  • yasaken
  • yasaken
  • 2012年02月02日 17:08
  • 12787

使用grub的memmap的预留内存时系统死机问题的一个解决方案

今天在测试文件系统时,改了以下grub的启动参数,从memmap=2G$1G改为memmap=8G$1G,然后写文件的时候,写了几个文件,系统就不响应了。刚开始还以为是文件系统的问题,排除了死锁、内存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析
举报原因:
原因补充:

(最多只允许输入30个字)