了解Linux / proc / id / maps


155

我试图了解嵌入式Linux应用程序的内存使用情况。的/proc/pid/maps实用程序/文件似乎是查看详细信息的好资源。不幸的是,我不理解所有的列和条目。

匿名索引节点0条目是什么意思?这些似乎是一些较大的内存段。


1
proc(5) mmap(2)“了解Linux内核” 9.3。内存区域;16.2。内存映射“了解Linux虚拟内存管理器” 4.4内存区域
wRAR

Answers:


261

中的每一行都/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系统调用来更改权限。
  • offset-如果从文件(使用mmap)映射了区域,则这是映射开始的文件中的偏移量。如果内存不是从文件映射的,则仅为0。
  • 设备 -如果该区域是从文件映射的,则这是文件所在的主要和次要设备编号(十六进制)。
  • 索引节点 -如果该区域是从文件映射的,则为文件号。
  • pathname-如果区域是从文件映射的,则这是文件的名称。对于匿名映射区域,此字段为空白。此外还有一些与名特殊地区,如[heap][stack][vdso][vdso]代表虚拟动态共享对象。系统调用使用它来切换到内核模式。这是一篇很好的文章:“什么是linux-gate.so.1?”

您可能会注意到很多匿名区域。这些通常由mmap但不附加到任何文件创建。它们用于许多其他事情,例如共享内存或未在堆上分配的缓冲区。例如,我认为pthread库使用匿名映射的区域作为新线程的堆栈。


4
是的,pthread正在为具有较小段的堆栈分配8Mb块,以进行堆栈溢出检测(我认为)。因此,默认情况下,每个创建的pthread都会分配一个8Mb的inode 0内存区域和一个4Kb的inode 0区域。
simon

因此,在您的示例中,gpm是从一开始就将二进制文件与ELF标头等映射到某个虚拟地址吗?加载程序不是应该解析ELF标头并映射各个部分,而不是整个文件吗?
德米特里·格里戈里耶夫

9

内存映射不仅用于将文件映射到内存,而且还是从内核请求RAM的工具。这些是那些inode 0条目-您的堆栈,堆,bss段等等


5

请检查: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下,没有提供路径名的字段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.