有关/proc/pid/maps

下面这段打印是读use_libhdca_util程序对应pid的map得到的打印:

 

00110000-00263000 r-xp 00000000 fd:00 2197259    /lib/libc-2.5.so

00263000-00264000 ---p 00153000 fd:00 2197259    /lib/libc-2.5.so

00264000-00266000 r--p 00153000 fd:00 2197259    /lib/libc-2.5.so

00266000-00267000 rw-p 00155000 fd:00 2197259    /lib/libc-2.5.so

00267000-0026a000 rw-p 00267000 00:00 0

0026a000-00275000 r-xp 00000000 fd:00 2197271    /lib/libgcc_s-4.1.2-20080825.so.1

00275000-00276000 rw-p 0000a000 fd:00 2197271    /lib/libgcc_s-4.1.2-20080825.so.1

0063b000-00656000 r-xp 00000000 fd:00 2197258    /lib/ld-2.5.so

00656000-00657000 r--p 0001a000 fd:00 2197258    /lib/ld-2.5.so

00657000-00658000 rw-p 0001b000 fd:00 2197258    /lib/ld-2.5.so

0073b000-0073c000 r-xp 0073b000 00:00 0          [vdso]

007b6000-007dd000 r-xp 00000000 fd:00 2197272    /lib/libm-2.5.so

007dd000-007de000 r--p 00026000 fd:00 2197272    /lib/libm-2.5.so

007de000-007df000 rw-p 00027000 fd:00 2197272    /lib/libm-2.5.so

007e1000-007e4000 r-xp 00000000 fd:00 2197268    /lib/libdl-2.5.so

007e4000-007e5000 r--p 00002000 fd:00 2197268    /lib/libdl-2.5.so

007e5000-007e6000 rw-p 00003000 fd:00 2197268    /lib/libdl-2.5.so

007fd000-00812000 r-xp 00000000 fd:00 2197262    /lib/libpthread-2.5.so

00812000-00813000 ---p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

00813000-00814000 r--p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

00814000-00815000 rw-p 00016000 fd:00 2197262    /lib/libpthread-2.5.so

00815000-00817000 rw-p 00815000 00:00 0

00d10000-00f00000 r-xp 00000000 fd:00 1606929    /root/ltc/test_exe_and_so/libhdca_util.so

00f00000-00f1b000 rw-p 001ef000 fd:00 1606929    /root/ltc/test_exe_and_so/libhdca_util.so

00f1b000-00f9e000 rw-p 00f1b000 00:00 0

04910000-049f0000 r-xp 00000000 fd:00 1222880    /usr/lib/libstdc++.so.6.0.8

049f0000-049f4000 r--p 000df000 fd:00 1222880    /usr/lib/libstdc++.so.6.0.8

049f4000-049f5000 rw-p 000e3000 fd:00 1222880    /usr/lib/libstdc++.so.6.0.8

049f5000-049fb000 rw-p 049f5000 00:00 0

08048000-08049000 r-xp 00000000 fd:00 1606930    /root/ltc/test_exe_and_so/use_libhdca_util

08049000-0804a000 rw-p 00000000 fd:00 1606930    /root/ltc/test_exe_and_so/use_libhdca_util

085ad000-085ce000 rw-p 085ad000 00:00 0          [heap]

b7f2e000-b7f31000 rw-p b7f2e000 00:00 0

bf8bb000-bf8d0000 rw-p bffe9000 00:00 0          [stack]

 

各个字段的含义如下:

第一列:00110000-00263000
  
  本段内存映射的虚拟地址空间范围,
  对应vm_area_struct中的vm_start和vm_end。 第二列:r
-xp
  
  此段虚拟地址空间的属性。每种属性用一个字段表示,
  r表示可读,w表示可写,x表示可执行,
  p和s共用一个字段,互斥关系,p表示私有段,s表示共享段,
  如果没有相应权限,则用’-’代替。 第三列:00000000

  针对有名映射,指本段映射地址在文件中的偏移,对应vm_pgoff。
  对匿名映射而言,为vm_area_struct->vm_start。 第四列:fd:00
  
  所映射的文件所属设备的设备号,
  对应vm_file->f_dentry->d_inode->i_sb->s_dev。
  匿名映射为0。其中fd为主设备号,00为次设备号。 第五列:
2197259

  文件的索引节点号,对应vm_file->f_dentry->d_inode->i_ino,
  与ls –i显示的内容相符。匿名映射为0。 第六列:
/lib/libc-2.5.so
  
  所映射的文件名。对有名映射而言,是映射的文件名,对匿名映射来说,
  是此段内存在进程中的作用。
  [stack]表示本段内存作为栈来使用,[heap]作为堆来使用,其他情况则为无。

 

 

我们不难发现,有的so在这个列表中出现了多行,比如/lib/libpthread-2.5.so,它出现了四次(而且它后面还跟了一条没有文件名的):

007fd000-00812000 r-xp 00000000 fd:00 2197262    /lib/libpthread-2.5.so

00812000-00813000 ---p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

00813000-00814000 r--p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

00814000-00815000 rw-p 00016000 fd:00 2197262    /lib/libpthread-2.5.so

00815000-00817000 rw-p 00815000 00:00 0

 

可以看到,除了最后一行和下面没有文件名的那行权限一样,其他的权限都不一样,因为权限不同,不能合并。

下面具体分析下各行的含义:

 

第一行:

007fd000-00812000 r-xp 00000000 fd:00 2197262    /lib/libpthread-2.5.so

  该r-xp条目描述了一块可执行内存(x权限标志)。这就是代码。

 

第二行:

00812000-00813000 ---p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

  该"---p"条目是两个LOAD区间中空闲的内存空间

 

第三行:

00813000-00814000 r--p 00015000 fd:00 2197262    /lib/libpthread-2.5.so

  该r--p条目描述了一个只能读取的内存块(r权限标志)。那是静态数据(常量)。

 

第四行:

00814000-00815000 rw-p 00016000 fd:00 2197262    /lib/libpthread-2.5.so

  该rw-p条目描述了一个可写的内存块(w权限标志)。这是用于库的全局变量。

 

第五行:

00815000-00817000 rw-p 00815000 00:00 0

  该没有文件名的条目,实际上是上一个有文件名的(也就是/lib/libpthread-2.5.so)中.bss段的映射,
  因为一些全局为初始化变量是位于bss段的,它们并不在文件中占用空间,需要在加载时清零。
  所以做文件映射就不能实现该功能(因为文件里没有对应的内容),所以这里其实是映射到了一个匿名的私有空间,
  逻辑地址空间和前面的连续。

 

posted @ 2021-06-08 15:53  94那抹微笑  阅读(102)  评论(0编辑  收藏  举报