小编典典

了解 Linux /proc/pid/maps 或 /proc/self/maps

all

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

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


阅读 116

收藏
2022-07-18

共1个答案

小编典典

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

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

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

2022-07-18