解释proc / <pid> / maps输出的不同行

时间:2016-07-24 23:29:00

标签: c linux

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

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

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

3. [vdso]地区的目的是什么?

4. [stack]区域的目的是什么? (我假设这不是主函数的实际堆栈,因为程序堆栈通常从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]

1 个答案:

答案 0 :(得分:0)

首先,我们应该知道每列的平均值。第一列表示虚拟内存中的起始和结束地址。第二列表示该扇区的权限,r =读取,w =写入,x =可执行,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

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

堆栈扇区是这个进程的堆栈,堆栈扇区保留本地数据。

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