了解Linux / proc / id / maps

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

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'。 如果一个区域不共享,它是私人的,所以会出现一个“p”而不是“s”。 如果进程试图以不允许的方式访问内存,则会产生分段错误。 权限可以使用mprotect系统调用进行更改。
  • 偏移量 – 如果区域是从文件映射的(使用mmap ),则这是映射开始处的文件偏移量。 如果内存不是从一个文件映射,它只是0。
  • 设备 – 如果区域是从文件映射的,则这是文件所在的主要和次要设备编号(hex)。
  • inode – 如果区域是从文件映射的,则是文件编号。
  • path名 – 如果区域是从文件映射的,则这是文件的名称。 该字段对于匿名映射区域是空白的。 还有一些特殊的区域,如[heap][stack][vdso][vdso]代表虚拟dynamic共享对象。 它被系统调用用来切换到内核模式。 这是一个很好的文章。

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

proc(5)

mmap(2)

“了解Linux内核”9.3。 内存区域; 16.2。 内存映射

“了解Linux虚拟内存pipe理器”4.4内存区域

内存映射不仅用于将文件映射到内存中,而且还是从内核请求RAM的工具。 这些是inode 0条目 – 你的堆栈,堆,bss段和更多

请检查: 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是设备(major:minor);

inode是该设备上的inode。0表示没有inode与内存区域关联,就像BSS(未初始化的数据)一样。

path名字段通常是支持映射的文件。 对于ELF文件,您可以通过查看ELF程序头文件(readelf -l)中的偏移量字段来轻松地与偏移量字段进行协调。

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