【发布时间】: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