c - 如何识别/proc/$PID/maps文件中的STACK和HEAP段?

标签 c linux proc

我可以识别/proc/$PID/maps 文件中的 text、ds 和 bss 段(通过猜测或借助特定段的访问说明符)。但是堆和堆栈段是顺序给出的。有没有办法区分哪个段属于栈,哪个段属于堆?

-----本例中如何识别堆和栈的划分---------- 0a8a0000-0ab2e000 rw-p 0a8a0000 00:00 0 [堆]
< b648e000-b648f000 ---p b648e000 00:00 0
< b648f000-b6496000 rw-p b648f000 00:00 0
< b6496000-b6497000 ---p b6496000 00:00 0
< b6497000-b649e000 rw-p b6497000 00:00 0
< b649e000-b649f000 ---p b649e000 00:00 0
< b649f000-b64a6000 rw-p b649f000 00:00 0
< b64a6000-b64a7000 ---p b64a6000 00:00 0
< b64a7000-b64ae000 rw-p b64a7000 00:00 0
< b64ae000-b64af000 ---p b64ae000 00:00 0
< b64af000-b657a000 rw-p b64af000 00:00 0
< b657a000-b657b000 ---p b657a000 00:00 0
< b657b000-b65a5000 rw-p b657b000 00:00 0
< b65a5000-b65a6000 ---p b65a5000 00:00 0
< b65a6000-b67ca000 rw-p b65a6000 00:00 0
< b67ca000-b67cb000 ---p b67ca000 00:00 0
< b67cb000-b69ff000 rw-p b67cb000 00:00 0
< b69ff000-b6a00000 ---p b69ff000 00:00 0
< b6a00000-b6bff000 rw-p b6a00000 00:00 0
< b6bff000-b6c00000 ---p b6bff000 00:00 0
< b6c00000-b6dff000 rw-p b6c00000 00:00 0
< b6dff000-b6e00000 ---p b6dff000 00:00 0
< b6e00000-b6fff000 rw-p b6e00000 00:00 0
< b6fff000-b7000000 ---p b6fff000 00:00 0
< b7000000-b70fd000 rw-p b7000000 00:00 0
< b70fd000-b70fe000 ---p b70fd000 00:00 0
< b70fe000-b72fd000 rw-p b70fe000 00:00 0
< b72fd000-b72fe000 ---p b72fd000 00:00 0
< b72fe000-b7548000 rw-p b72fe000 00:00 0
< b7548000-b7549000 ---p b7548000 00:00 0
< b7549000-b7f37000 rw-p b7549000 00:00 0
< b7f4b000-b7f4c000 ---p b7f4b000 00:00 0
< b7f4c000-b7f51000 rw-p b7f4c000 00:00 0
< bfbae000-bfbc3000 rw-p bffea000 00:00 0 [堆栈]

最佳答案

/proc/PID/maps 文件包含当前映射的内存区域和 他们的访问权限。

格式为:

address           perms offset  dev   inode      pathname

08048000-08049000 r-xp 00000000 03:00 8312       /opt/test
08049000-0804a000 rw-p 00001000 03:00 8312       /opt/test
0804a000-0806b000 rw-p 00000000 00:00 0          [heap]
a7cb1000-a7cb2000 ---p 00000000 00:00 0
a7cb2000-a7eb2000 rw-p 00000000 00:00 0
a7eb2000-a7eb3000 ---p 00000000 00:00 0
a7eb3000-a7ed5000 rw-p 00000000 00:00 0          [stack:1001]
a7ed5000-a8008000 r-xp 00000000 03:00 4222       /lib/libc.so.6
a8008000-a800a000 r--p 00133000 03:00 4222       /lib/libc.so.6
a800a000-a800b000 rw-p 00135000 03:00 4222       /lib/libc.so.6
a800b000-a800e000 rw-p 00000000 00:00 0
a800e000-a8022000 r-xp 00000000 03:00 14462      /lib/libpthread.so.0
a8022000-a8023000 r--p 00013000 03:00 14462      /lib/libpthread.so.0
a8023000-a8024000 rw-p 00014000 03:00 14462      /lib/libpthread.so.0
a8024000-a8027000 rw-p 00000000 00:00 0
a8027000-a8043000 r-xp 00000000 03:00 8317       /lib/ld-linux.so.2
a8043000-a8044000 r--p 0001b000 03:00 8317       /lib/ld-linux.so.2
a8044000-a8045000 rw-p 0001c000 03:00 8317       /lib/ld-linux.so.2
aff35000-aff4a000 rw-p 00000000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

其中“address”是它占用的进程中的地址空间,“perms” 是一组权限:

r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

“offset”是映射中的偏移量,“dev”是设备(major:minor),以及 “inode”是该设备上的 inode。 0表示没有关联inode 与内存区域,如 BSS(未初始化数据)的情况。 “路径名”显示此映射的关联文件的名称。如果映射 不与文件关联:

 [heap]                   = the heap of the program
 [stack]                  = the stack of the main process
 [stack:1001]             = the stack of the thread with tid 1001
 [vdso]                   = the "virtual dynamic shared object",
                            the kernel system call handler

或者如果为空,映射是匿名的。 (来源 https://www.kernel.org/doc/Documentation/filesystems/proc.txt)

关于c - 如何识别/proc/$PID/maps文件中的STACK和HEAP段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379793/

相关文章:

c - 我对这个问题的递归解决方案是否正确?

ruby-on-rails - ENV 变量仅在生产控制台中可用,而不在应用程序中可用 - Rails、Figaro Gem

Linux -/proc/PID 何时创建?

python - 设置 Python 二进制模块构建的包含路径

c - 如何从 Linux 获取窗口大小

c - Makefile,clang OK,gcc错误

linux -/proc/$PID/maps 中的 "/dev/zero (deleted)"、 "anon_inode:dmabuf"来自哪里?

linux - pactl list sources short 后没有 bluez 设备

c++ - 如何在Linux下用C++获取缓冲/缓存内存大小?

linux - 从/proc 中查找网络地址