嵌入式Linux:/proc/pid/maps中的第一个偏移量错误?

3

我尝试在我的嵌入式Linux(ARM)上使用内核版本2.6.37.6中的/proc/pid/maps映射,但似乎第一行(可执行文件本身的代码段)的偏移量有误。

我总是看到这样一行:

00008000-00061000 r-xp 00000000 00:10 8073509 myprog

(范围是进程地址空间中的地址,权限后面的数字应该是文件中的偏移量)

然而,实际的偏移量似乎是0x8000-至少,使用这个假设的解释更加可信。 nm向我展示myprog在0x8000之前没有代码,所以这也是说得通的。

有人可以给我指点一下,告诉我在哪里可以找到更多关于这个问题的信息吗?我找不到任何东西。

我正在做什么:我编写了一个工具来解释由mtrace()生成的日志,找到可能的内存泄漏,并将其追溯到分配数据的代码。对于后一步,我从日志中获取指令指针,在/proc/pid/maps中查找运行时映射,以找到相关的可执行文件或库,并使用它们的nm-map来找到实际执行分配操作的函数。
这个方法对除了可执行文件本身之外的所有情况都非常有效。
1个回答

2

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

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

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


这行代码不是用于匿名映射的。为什么偏移量为0? - Daniel Walker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接