Answers:
中的每一行都/proc/$PID/maps
描述了进程或线程中连续虚拟内存的区域。每行都有以下字段:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
-
将出现a而不是r
/ w
/ x
。如果区域不共享的,它是私人,所以p
会出现,而不是一个s
。如果该进程尝试以不允许的方式访问内存,则会产生分段错误。可以使用mprotect
系统调用来更改权限。mmap
)映射了区域,则这是映射开始的文件中的偏移量。如果内存不是从文件映射的,则仅为0。[heap]
,[stack]
或[vdso]
。[vdso]
代表虚拟动态共享对象。系统调用使用它来切换到内核模式。这是一篇很好的文章:“什么是linux-gate.so.1?”您可能会注意到很多匿名区域。这些通常由mmap
但不附加到任何文件创建。它们用于许多其他事情,例如共享内存或未在堆上分配的缓冲区。例如,我认为pthread库使用匿名映射的区域作为新线程的堆栈。
gpm
是从一开始就将二进制文件与ELF标头等映射到某个虚拟地址吗?加载程序不是应该解析ELF标头并映射各个部分,而不是整个文件吗?
请检查:http : //man7.org/linux/man-pages/man5/proc.5.html
address perms offset dev inode pathname
00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
地址字段是映射所占用的过程中的地址空间。
perms字段是一组权限:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
offset字段是文件/其他文件的偏移量;
dev是设备(主要:次要);
inode是该设备上的inode。0表示没有inode与内存区域关联,就像BSS(未初始化的数据)一样。
路径名字段通常将是支持映射的文件。对于ELF文件,可以通过查看ELF程序标头(readelf -l)中的Offset字段轻松地与offset字段进行协调。
在Linux 2.0下,没有提供路径名的字段。
proc(5)
mmap(2)
“了解Linux内核” 9.3。内存区域;16.2。内存映射“了解Linux虚拟内存管理器” 4.4内存区域