理解 Linux/proc/pid/map 或/proc/self/map

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

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

164179 次浏览

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

/proc/$PID/maps中的每一行描述了进程或线程中连续虚拟内存的一个区域。每一行都有以下字段:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • 地址-这是进程地址空间中区域的起始和结束地址
  • 权限-这描述了如何访问该区域中的页面。有四种不同的权限: 读、写、执行和共享。如果禁用读/写/执行,将出现一个 -,而不是 r/w/x。如果一个区域不是 分享,那么它是 二等兵,因此将出现一个 p而不是 s。如果进程试图以不允许的方式访问内存,就会产生一个内存区段错误。可以使用 mprotect系统调用更改权限。
  • 如果区域是从一个文件映射的(使用 mmap) ,这是映射开始的文件中的偏移量。如果没有从文件映射内存,那么它只是0。
  • 装置-如果区域是从文件映射的,这是文件所在的主设备号和次设备号(十六进制)。
  • Inode-如果区域是从文件映射的,这是文件编号。
  • 路径名-如果区域是从文件映射的,这是文件的名称。此字段对于匿名映射区域是空白的。还有一些特殊区域的名称,如 [heap][stack][vdso][vdso]代表虚拟动态共享对象。它被系统调用用来切换到内核模式。这里有一篇关于它的好文章: “什么是 linux-gate. so.1?”

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

请检查: 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)

偏移量字段是文件/其他内容的偏移量;

Dev 是设备(主要: 次要) ;

Inode 是该设备上的 inode。0表示没有 inode 与内存区域相关联,BSS (未初始化的数据)就是这种情况。

路径名字段通常是正在备份的文件 对于 ELF 文件,您可以很容易地与 通过查看 ELF 中的偏移量字段来获取偏移量字段 程序头(readself-l)

在 Linux 2.0下,没有给出路径名的字段。