【问题标题】:Interpret different lines of the proc/<pid>/maps output解释 proc/<pid>/maps 输出的不同行
【发布时间】:2016-11-28 05:05:55
【问题描述】:

在 Ubuntu 32 位机器上,我读出了一个进程的内存映射,这是我编写的一个简单的 C 程序。我注意到为 /malloc/malloc_example 分配了三个内存区域,这是我的二进制文件的路径。几个问题:

1.这三个内存区域的含义是什么? (第二个看起来像栈)

2.同理,/lib/i386-linux-gnu/libc-2.15.so的三个内存区域是什么意思?

3.[vdso]区域的作用是什么?

4. [stack] 区域的用途是什么? (我假设这不是 main 函数的实际堆栈,因为程序堆栈通常从 0x0804xxxx 开始)

$cat /proc/27429/maps 
08048000-08049000 r-xp 00000000 08:01 292930     /malloc/malloc_example
08049000-0804a000 r-xp 00000000 08:01 292930     /malloc/malloc_example
0804a000-0804b000 rwxp 00001000 08:01 292930     /malloc/malloc_example
b7e05000-b7e07000 rwxp 00000000 00:00 0 
b7e07000-b7faa000 r-xp 00000000 08:01 7311       /lib/i386-linux-gnu/libc-2.15.so
b7faa000-b7fac000 r-xp 001a3000 08:01 7311       /lib/i386-linux-gnu/libc-2.15.so
b7fac000-b7fad000 rwxp 001a5000 08:01 7311       /lib/i386-linux-gnu/libc-2.15.so
b7fad000-b7fb0000 rwxp 00000000 00:00 0 
b7fb0000-b7fc7000 r-xp 00000000 08:01 7416       /lib/i386-linux-gnu/libpthread-2.15.so
b7fc7000-b7fc8000 r-xp 00016000 08:01 7416       /lib/i386-linux-gnu/libpthread-2.15.so
b7fc8000-b7fc9000 rwxp 00017000 08:01 7416       /lib/i386-linux-gnu/libpthread-2.15.so
b7fc9000-b7fcb000 rwxp 00000000 00:00 0 
b7fd9000-b7fdd000 rwxp 00000000 00:00 0 
b7fdd000-b7fde000 r-xp 00000000 00:00 0          [vdso]
b7fde000-b7ffe000 r-xp 00000000 08:01 7612       /lib/i386-linux-gnu/ld-2.15.so
b7ffe000-b7fff000 r-xp 0001f000 08:01 7612       /lib/i386-linux-gnu/ld-2.15.so
b7fff000-b8000000 rwxp 00020000 08:01 7612       /lib/i386-linux-gnu/ld-2.15.so
bffdf000-c0000000 rwxp 00000000 00:00 0          [stack]

【问题讨论】:

标签: c linux


【解决方案1】:

首先,我们应该知道每一列的平均值。第一列表示虚拟内存中的开始和结束地址。第二列表示该扇区的权限,r = read,w = write,x = executable,s = share ,p = private。第三列表示映射文件中的地址偏移量。第四列表示映射文件的主设备号和次设备号。第五列表示inode编号。最后表示映射文件的名称。


因此,某些路径有三个内存区域是因为这些扇区具有不同的权限。某些扇区是代码扇区,该扇区具有 r+w+x 权限。一些是只读数据扇区,其他可能是读取-写入数据扇区。下一个原因是映射文件中的偏移量不同。您可以在这两行中看到:

b7fb0000-b7fc7000 r-xp 00000000 08:01 7416       /lib/i386-linux-gnu/libpthread-2.15.so
b7fc7000-b7fc8000 r-xp 00016000 08:01 7416       /lib/i386-linux-gnu/libpthread-2.15.so

偏移量不同,表示两个扇区来自同一个文件,但位置不同。


stack Sector是本次进度的堆栈,stack Sector保存本地数据。


vspd 表示虚拟动态共享对象,它是一个.so 文件,它不存储在磁盘中,而是存储在内核中。当程序开始运行时,内核会将内存页(stroe .so 文件)映射到程序的内存中。您可以使用命令@ 987654322@获取更多信息。

【讨论】:

  • 你能更具体地介绍一下每个库的三行吗?
  • /lib/i386-linux-gnu/libc-2.15.so为例,'r-xp'的权限是这个库的code.sector,存放二进制可执行指令。从/lib/i386-linux-gnu/libc-2.15.so有两个code扇区,偏移量为00000000和001a3000.'rwxp'的权限是本库的数据扇区,存放pragram全局变量。
  • 我认为(不确定)是编译器不会加载所有库,而是加载其中的一部分。映射文件(此库)中的这两个不同的偏移量。
猜你喜欢
  • 2014-03-15
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多