代码之家  ›  专栏  ›  技术社区  ›  simon

了解linux/proc/id/maps

  •  128
  • simon  · 技术社区  · 16 年前

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

    是否有良好的资源/文档 proc/pid/maps 实用工具/文件?

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

    4 回复  |  直到 7 年前
        1
  •  218
  •   jfMR    7 年前

    每行 /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。
    • 装置 -如果区域是从文件映射的,则这是文件所在的主设备号和次设备号(十六进制)。
    • 索引节点 -如果区域是从文件映射的,则这是文件号。
    • 路径名 -如果区域是从文件映射的,则这是文件名。对于匿名映射区域,此字段为空。也有一些特殊的地区,比如 [heap] , [stack] [vdso] . [VDSO ] 表示虚拟动态共享对象。它被系统调用用来切换到内核模式。 Here's a good article about it.

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

        2
  •  18
  •   wRAR    16 年前

    proc(5)

    mmap(2)

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

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

        3
  •  8
  •   Xeor    16 年前

    内存映射不仅用于将文件映射到内存中,而且是从内核请求RAM的工具。这些是inode 0项-您的堆栈、堆、BSS段等等

        4
  •  2
  •   cahit beyaz    9 年前

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

    “偏移”字段是文件中的偏移量/whatever;

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

    inode是该设备上的inode。0表示没有inode与memoryRegion相关联,就像BSS(未初始化数据)那样。

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

    在Linux2.0下,没有提供路径名的字段。