linux proc pid maps,linux下/proc/pid/maps和pmap命令详解

一.示例代码:

1.创建pmap.c文件:

vi pmap.c

2.输入如下内容:

#inculde

int main()

{

char *str;

str = (char *) malloc(15);

while(1)

{

;

}

return 0;

}

3.编译pmap.c文件:

gcc pmap.c -o pmap

4.运行pmap可执行文件

./pmap

二.查看/proc/pid/maps文件信息

1.找到pmap进程的pid号:

$ps aux |grep pmap

2.打印输出/proc/pid/maps文件信息:

cat /proc/565/maps

输出结果如下:

08048000-08049000 r-xp 00000000 08:03 5636417 /root/test/pmap

08049000-0804a000 rw-p 00000000 08:03 5636417 /root/test/pmap

0952c000-0954d000 rw-p 00000000 00:00 0 [heap]

77573000-77574000 rw-p 00000000 00:00 0

77574000-77723000 r-xp 00000000 08:03 262816 /lib/libc-2.21.so

77723000-77726000 r--p 001ae000 08:03 262816 /lib/libc-2.21.so

77726000-77728000 rw-p 001b1000 08:03 262816 /lib/libc-2.21.so

77728000-7772a000 rw-p 00000000 00:00 0

7772f000-77730000 rw-p 00000000 00:00 0

77730000-77732000 r--p 00000000 00:00 0 [vvar]

77732000-77733000 r-xp 00000000 00:00 0 [vdso]

77733000-77754000 r-xp 00000000 08:03 262539 /lib/ld-2.21.so

77754000-77755000 r--p 00021000 08:03 262539 /lib/ld-2.21.so

77755000-77756000 rw-p 00022000 08:03 262539 /lib/ld-2.21.so

7fcad000-7fcce000 rw-p 00000000 00:00 0 [stack]

输出的信息依次为:

第一列:本段在虚拟内存中的地址范围。

第二列:本段的权限。

第三列:偏移地址,即指本段映射地址在文件中的偏移。

第四列:主设备号与次设备号。

第五列:文件索引节点号。

第六列:映射的文件名。

经过上面的分析,proc maps中的每一列代表的意思已经非常清晰了。接下来看下proc每maps中每一行的解析。各共享库的代码段,存放着二进制可执行的机器指令,由kernel把该库ELF文件的代码段map到虚存空间;各共享库的数据段,存放着程序执行所需的全局变量,由kernel把ELF文件的数据段map到虚存空间;用户代码段,存放着二进制形式的可执行的机器指令,由kernel把ELF文件的代码段map到虚存空间;用户数据段,存放着程序执行所需的全局变量,由kernel把ELF文件的数据段map到虚存空间;堆(heap),当且仅当malloc调用时存在,由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在;栈(stack),作为进程的临时数据区,由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。

08048000-08049000 r-xp 00000000 08:03 5636417 /root/test/pmap

08049000-0804a000 rw-p 00000000 08:03 5636417 /root/test/pmap

其中第一行的权限是只读,并且可执行,说明第一行是应用程序的代码段,而第二行的权限是可读可写,但是没有执行权限,说明该段是数据段。

0952c000-0954d000 rw-p 00000000 00:00 0 [heap]

有些maps文件并不会出现该记录,这主要跟程序中有无使用malloc相关,如果程序中使用了malloc就会有该记录,否则就没有。

77573000-77574000 rw-p 00000000 00:00 0

这一段是bss段。

77574000-77723000 r-xp 00000000 08:03 262816 /lib/libc-2.21.so

77723000-77726000 r--p 001ae000 08:03 262816 /lib/libc-2.21.so

77726000-77728000 rw-p 001b1000 08:03 262816 /lib/libc-2.21.so

77728000-7772a000 rw-p 00000000 00:00 0

以上是libc-2.21共享库在maps文件中的记录,每个共享库在maps文件中对应着三行,分别是数据段与代码段。第四行是bss段。

7fcad000-7fcce000 rw-p 00000000 00:00 0 [stack]

该段是栈。

77732000-77733000 r-xp 00000000 00:00 0 [vdso]

该段表示它的地址已经位于内核空间了(即大于0xc0000000的地址),事实上它是一个内核的模块,进程可以通过访问这一个段来与内核通信。

三.pmap命令的使用

1.pmap命令的介绍:

-x extended显示扩展格式

-d device显示设备格式

-q quiet不显示header/footer行

-V 显示版本信息

2.pmap命令使用详解:

输入pmap -d 565

输出信息如下:

565: ./pmap

Address Kbytes Mode Offset Device Mapping

08048000 4 r-x-- 0000000000000000 008:00003 pmap

08049000 4 rw--- 0000000000000000 008:00003 pmap

0952c000 132 rw--- 0000000000000000 000:00000 [ anon ]

77573000 4 rw--- 0000000000000000 000:00000 [ anon ]

77574000 1724 r-x-- 0000000000000000 008:00003 libc-2.21.so

77723000 12 r---- 00000000001ae000 008:00003 libc-2.21.so

77726000 8 rw--- 00000000001b1000 008:00003 libc-2.21.so

77728000 8 rw--- 0000000000000000 000:00000 [ anon ]

7772f000 4 rw--- 0000000000000000 000:00000 [ anon ]

77730000 8 r---- 0000000000000000 000:00000 [ anon ]

77732000 4 r-x-- 0000000000000000 000:00000 [ anon ]

77733000 132 r-x-- 0000000000000000 008:00003 ld-2.21.so

77754000 4 r---- 0000000000021000 008:00003 ld-2.21.so

77755000 4 rw--- 0000000000022000 008:00003 ld-2.21.so

7fcad000 132 rw--- 0000000000000000 000:00000 [ stack ]

mapped: 2184K writeable/private: 296K shared: 0K

Address: 内存开始地址

Kbytes: 占用内存的字节数(KB)

RSS: 保留内存的字节数(KB)

Dirty: 脏页的字节数(包括共享和私有的)(KB)

Mode: 内存的权限:read、write、execute、shared、private (写时复制)

Mapping: 占用内存的文件、或[anon](分配的内存)、或[stack](堆栈)

Offset: 文件偏移

Device: 设备名 (major:minor)

最后一行的值

mapped :表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小。

writeable/private : 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小。

shared: 表示进程和其他进程共享的内存大小。

注意:共享库只在内存中有一份,是所有进程共享的,这里该进程实际占用空间大小为writeable/private占用的空间大小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值