【问题标题】:Why is the stack lower than the text in memory?为什么堆栈比内存中的文本低?
【发布时间】:2013-03-13 01:35:39
【问题描述】:

我正在使用 Windbg 研究进​​程内存,并且不禁注意到人们只是接受的一些东西。当您打印出寄存器时:

eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000
eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000286

请注意,ESP 和 EBP 的值低于 EIP,这意味着堆栈比进程的文本部分低(!?)。为什么是这样?据我所知(我在 Linux 中也使用 gdb 做过同样的事情),堆栈应该在高内存和低文本 - 就像在许多书中所说的那样。

有什么我不知道的吗?

【问题讨论】:

  • 内存的布局方式由操作系统和CPU决定。 CPU 决定堆栈的增长方式,取决于它决定放置段的操作系统。它确实可以在任何地方,但堆栈增长的方向是一个很大的影响。他们把它放在任何有意义的地方(在某些情况下,任何更安全的地方)。
  • 堆栈仍然向下增长,我认为将堆栈低于文本根本没有意义,这就是我问的原因。您能否更具体地说明为什么将堆栈放低比使用理论上的内存布局更好?
  • 是不是windows内存管理的问题?
  • @sergmat:是的,确实如此。我预计堆栈会很高(例如 0xbfffxxxx)而文本会很低,所以我认为上述情况很奇怪。
  • 线程堆栈可以位于用户模式虚拟地址空间内的任何地址范围。 VMMap 显示了进程提交的虚拟内存类型的细分以及操作系统分配给这些类型的物理内存(工作集)的数量。

标签: windows memory-management process stack windbg


【解决方案1】:

堆栈应该在高内存和低文本

这是一种误解。完全由操作系统来选择如何在进程的虚拟内存中布局。

特别值得注意的是:

  • 没有单个代码段:可执行文件和 DLL 可以在不相邻的地址范围加载。
  • 没有单一的进程堆栈:每个线程都有自己独立的堆栈。同样,没有理由期望它们在内存中彼此相邻。

此外,随机化内存中事物的位置被认为是良好的安全实践。见Address space layout randomization

【讨论】:

  • 有道理。但我仍然不明白为什么他们必须把它放在那样的地方。猜猜它与同一虚拟内存空间中的单独堆栈线程有关。所以这里的结论是你不能期望在 Window 进程内存中有一个清晰的布局,对吗?
【解决方案2】:

Thread 堆栈可以位于用户模式virtual address space 内的任何地址范围内。 VMMap 显示进程提交的虚拟内存类型的细分。

【讨论】:

  • @NPE 的答案对我来说更清楚一些,但感谢分享有用的工具。
猜你喜欢
  • 2019-12-07
  • 2013-07-25
  • 1970-01-01
  • 2020-10-17
  • 2018-08-08
  • 1970-01-01
  • 2017-11-11
  • 2016-12-01
  • 1970-01-01
相关资源
最近更新 更多