我正在尝试了解我的嵌入式 Linux 应用程序的内存使用情况。 /proc/pid/maps
实用程序/文件似乎是查看详细信息的好资源。不幸的是,我不理解所有的列和条目。
匿名inode 0 条目是什么意思?这些似乎是一些较大的内存段。
最佳答案
/proc/$PID/maps
中的每一行都描述了进程或线程中的一个连续虚拟内存区域。每行包含以下字段:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
- 地址 - 这是进程地址空间中区域的起始和结束地址
- 权限 - 这描述了如何访问该区域中的页面。有四种不同的权限:读、写、执行和共享。如果读/写/执行被禁用,将出现
-
而不是r
/w
/x
。如果一个区域不是shared,它是private,所以会出现一个p
而不是一个s
。如果进程试图以不允许的方式访问内存,则会产生段错误。可以使用mprotect
系统调用更改权限。 - offset - 如果区域是从文件映射的(使用
mmap
),则这是映射开始的文件中的偏移量。如果内存不是从文件映射的,则它只是 0。 - 设备 - 如果该区域是从文件映射的,则这是文件所在的主要和次要设备号(十六进制)。
- inode - 如果区域是从文件映射的,则这是文件编号。
- 路径名 - 如果区域是从文件映射的,则这是文件的名称。对于匿名映射区域,此字段为空白。还有一些特殊区域的名称,如
[heap]
、[stack]
或[vdso]
。[vdso]
代表虚拟动态共享对象。系统调用使用它来切换到内核模式。 Here's a good article about it: "What is linux-gate.so.1?"
您可能会注意到很多匿名区域。这些通常由 mmap
创建,但不附加到任何文件。它们用于许多杂项,例如未在堆上分配的共享内存或缓冲区。例如,我认为 pthread 库使用匿名映射区域作为新线程的堆栈。
关于linux - 了解 Linux/proc/pid/maps 或/proc/self/maps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401359/