如何从/proc/[pid]/maps获得实际堆栈基础

  • 本文关键字:堆栈 proc pid maps linux
  • 更新时间 :
  • 英文 :


我正在尝试计算从堆栈开始到当前堆栈指针的偏移量。

当我读取/proc/[pid]/maps时,我看到

  befdf000-bf000000 rwxp 00000000 00:00 0          [stack]

0xbefdf000看起来像堆栈起始地址。问题是,当我在gdb中查看SP寄存器时,实际堆栈指针类似于0xbefff440。

堆栈从高地址增长到低,但0xbefff440> 0xbeffdf000,怎么可能实际堆栈指针高于最高堆栈地址从/proc/*/maps ?

根据gdb内存检查函数的最高可读堆栈地址是0xbeffffff,这看起来像真正的堆栈开始,但什么是beffff000在进程映射?如果它不是真正的堆栈基础,那么如何从/proc/获得0xbeffffff(这可能会改变ASLR启用)?

我正在qemu中运行ARM Debian的测试。我禁用了ASLR,所以堆栈地址在不同的程序运行之间不会改变。

我不明白你在问什么。估计你的数学算错了。

0xbefff440在0xbeffdf000到0xbeffffff的范围内,接近预期的范围的顶部。

这两个地址是堆栈可以存在的两个边界。如果尝试执行堆栈操作会使其扩展超过一个限制(在我们的情况下是下限或起始地址),操作系统将尝试增加堆栈段,降低低边缘以为新的堆栈条目腾出空间,或者在扩展堆栈失败的情况下发送SEGV信号(例如,如果它将与程序中断AKA堆重叠)

第一次push操作将写入段的最后一个字节。

最新更新