Linux下 /proc/maps 文件分析(转)

Linux下 /proc/maps 文件分析 收藏 
From:http://blog.csdn.net/wenxy1/archive/2008/12/23/3591243.aspx
/proc/<PID>/maps
查看进程的虚拟地址空间是如何使用的。
该文件有6列,分别为:
地址:库在进程里地址范围
权限:虚拟内存的权限,r=读,w=写,x=,s=共享,p=私有;
偏移量:库在进程里地址范围
设备:映像文件的主设备号和次设备号;
节点:映像文件的节点号;
路径: 映像文件的路径
每项都与一个vm_area_struct结构成员对应,
范例:
应用程序的正文段(权限为r-xp)从0x08048000到0x08049000,大小为4096;数据段从0x08049000到 0x0804a000,大小为1KB。该应用程序使用了两个库:lib和libc。Libc 的正文段从0x00391000到0x004b4000,大小为1164KB;数据段从0x004b5000到0x004b8000,大小为12KB.
Ld 的正文段从00378000到0038d000,大小为84KB;数据段从0x0038e000到0x0038f000,大小为4KB。该应用程序所使用的库所占的虚拟空间的大小从0x4b8000到0x378000,大小为1280KB,其实真正大小为VmLib(1251KB);因为是按页分配,每页大小为4KB。
[root@localhost ~]# cat /proc/7114/maps
08047000-080dc000 r-xp 00000000 03:06 884901 /bin/bash
080dc000-080e3000 rwxp 00094000 03:06 884901 /bin/bash
080e3000-08129000 rwxp 080e3000 00:00 0 [heap]
4d575000-4d58a000 r-xp 00000000 03:06 736549 /lib/ld-2.3.4.so
4d58a000-4d58b000 r-xp 00015000 03:06 736549 /lib/ld-2.3.4.so
4d58b000-4d58c000 rwxp 00016000 03:06 736549 /lib/ld-2.3.4.so
4d58e000-4d6b1000 r-xp 00000000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b1000-4d6b2000 r-xp 00123000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b2000-4d6b5000 rwxp 00124000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b5000-4d6b7000 rwxp 4d6b5000 00:00 0
4d6de000-4d6e0000 r-xp 00000000 03:06 736552 /lib/libdl-2.3.4.so
4d6e0000-4d6e2000 rwxp 00001000 03:06 736552 /lib/libdl-2.3.4.so
4d807000-4d80a000 r-xp 00000000 03:06 736567 /lib/libtermcap.so.2.0.8
4d80a000-4d80b000 rwxp 00002000 03:06 736567 /lib/libtermcap.so.2.0.8
b7bf2000-b7c1e000 r-xp 00000000 03:06 881337 /usr/lib/gconv/GB18030.so
b7c1e000-b7c20000 rwxp 0002b000 03:06 881337 /usr/lib/gconv/GB18030.so
b7c20000-b7c26000 r-xs 00000000 03:06 881502 /usr/lib/gconv/gconv-modules.cache
b7c26000-b7d2f000 r-xp 02197000 03:06 852489 /usr/lib/locale/locale-archive
b7d2f000-b7f2f000 r-xp 00000000 03:06 852489 /usr/lib/locale/locale-archive
b7f2f000-b7f38000 r-xp 00000000 03:06 734450 /lib/libnss_files-2.3.4.so
b7f38000-b7f3a000 rwxp 00008000 03:06 734450 /lib/libnss_files-2.3.4.so
b7f3a000-b7f3c000 rwxp b7f3a000 00:00 0
b7f51000-b7f52000 rwxp b7f51000 00:00 0
bfc3d000-bfc52000 rw-p bfc3d000 00:00 0 [[color=Red]stack][/color]
ffffe000-fffff000 ---p 00000000 00:00 0 [[color=Red]vdso[/color]]
[root@localhost ~]#
参数 解释
address: 0085d000-00872000 虚拟内存区域的起始和终止地址文件所占的地址空间
perms:rw-p 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
offset: 00000000 虚拟内存区域在被映射文件中的偏移量
dev: 03:08 文件的主设备号和次设备号
inode: 设备的节点号,0表示没有节点与内存相对应
name: /lib/ld-2.3.4.so 被映射文件的文件名
各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间;
各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间;
用户数据段之上是代码段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户数据段之下是堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在;
用户数据段之下是栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。
[root@localhost ~]# ldd /bin/bash
linux-gate.so.1 => (0xffffe000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4d807000)
libdl.so.2 => /lib/libdl.so.2 (0x4d6de000)
libc.so.6 => /lib/tls/libc.so.6 (0x4d58e000)
/lib/ld-linux.so.2 (0x4d575000)
[root@localhost ~]#
这个所谓的"linux-gate.so.1"的内容就是内核映射的代码,系统中其实并不存在这样一个链接库文件,它的名字是由ldd自己起的,了 0xffffe400这里的一段代码,这里就是内核为我们映射的系统调用入口代码。Mapped是该应用程序的虚拟空间的大小,这里的值比用top 或ps都大了4KB,就是最后0xffffe400-0xffffffff的代码;shared 给出共享的虚拟空间部分。


maps 只能用cat 查看,使用vi或vim时,会发出maps全为空.
maps可以帮助寻找bug所在的位置,即debug中有epc位置可以据maps找出是出在具体的哪个.so或其它文档;然后nm反汇编其文档,寻找相对偏移量的位置,就能找到问题所发生的行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/proc/$pid/maps 文件包含了一个进程的内存映射信息,每一行表示一个内存区域映射。每行的字段含义如下: 1. 起始地址:内存区域的起始地址。 2. 结束地址:内存区域的结束地址。 3. 权限:内存区域的权限,包括读(R)、写(W)、执行(X)、私有权限(P)和共享权限(S)。 4. 偏移量:内存区域相对于文件开头的偏移量,如果不是从文件映射过来,则为0。 5. 设备号:内存区域所在的设备号。 6. 节点号:内存区域所在的节点号。 7. 文件名:对应的文件名,如果是匿名映射,则为[ anon ]。 例如,下面是一个/proc/$pid/maps文件的示例: ``` 00400000-0040b000 r-xp 00000000 00:14 54790 /bin/cat 0060a000-0060b000 r--p 0000a000 00:14 54790 /bin/cat 0060b000-0060c000 rw-p 0000b000 00:14 54790 /bin/cat 00e2a000-00e4b000 rw-p 00000000 00:00 0 [heap] 7f3c5c000000-7f3c5c021000 rw-p 00000000 00:00 0 7f3c5c021000-7f3c60000000 ---p 00000000 00:00 0 7f3c615e4000-7f3c615e5000 rw-p 00000000 00:00 0 7f3c615e5000-7f3c615f2000 r-xp 00000000 08:01 18381 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so 7f3c615f2000-7f3c617f1000 ---p 0000d000 08:01 18381 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so 7f3c617f1000-7f3c617f2000 r--p 0000c000 08:01 18381 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so 7f3c617f2000-7f3c617f3000 rw-p 0000d000 08:01 18381 /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so ... ``` 这个示例中,第一行表示了/bin/cat这个可执行文件的代码段,第二行表示了它的只读数据段,第三行表示了它的读写数据段,第四行表示了进程的堆空间,第五行表示了一个匿名映射,第六行到第十行表示了一个共享库的内存映射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值