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

标签 linux embedded

我正在尝试了解我的嵌入式 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/

相关文章:

c - Linux 堆结构和 malloc() 和 free() 的行为

c - 传递 'memcpy' 的参数 2 会丢弃来自指针目标类型的 'volatile' 限定符

c++ - 嵌入式软件缺陷率

c - 如何同步接收串口数据?

c++ - 传递外围对象以用作嵌入式系统中的类成员

c - 嵌入式设备可能的堆栈大小

c - 将 ESP8266 SDK 移植到 ESP32

sql - 在 shell 中自动安装和创建 postgresql 数据库

linux - 全局描述符表(GTD)的现代用法是什么?

java - 同时打开两个mysql数据库的连接