Windows 为什么堆栈低于内存中的文本?

Windows 为什么堆栈低于内存中的文本?,windows,memory-management,process,stack,windbg,Windows,Memory Management,Process,Stack,Windbg,我正在使用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=00

我正在使用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中也做过同样的事情),堆栈应该是在高内存中,而文本应该是在低内存中——就像许多书中所说的那样

有什么我不知道的吗

堆栈应该在高内存中,文本应该在低内存中

这是一种误解。如何在进程的虚拟内存中布局完全取决于操作系统

特别值得注意的是:

  • 没有一个代码段:可执行文件和DLL可以在不相邻的地址范围内加载
  • 没有单个进程堆栈:每个线程都有自己的独立堆栈。同样,也没有理由期望它们在内存中彼此相邻
此外,随机化内存中事物的位置被认为是良好的安全实践。请参阅。

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

内存的布局方式由操作系统和CPU决定。CPU决定堆栈以何种方式增长,并由操作系统决定在何处放置段。它确实可能在任何地方,但堆栈的增长方向是一个很大的影响。他们把它放在任何有意义的地方(在某些情况下,放在更安全的地方)。堆栈仍然向下增长,我认为把堆栈放在低于文本的位置根本没有意义,这就是为什么我要问。你能更具体地解释为什么把堆栈放低比使用理论上的内存布局更好吗?这是关于windows内存管理的问题吗?@sergmat:是的,基本上是这样。我期待堆栈在某个高的地方(类似于<代码> 0xBFFFXXXX)和文本要低,所以我考虑上面的奇怪。线程堆栈可以位于用户模式虚拟地址空间内的任何地址范围内。显示进程提交的虚拟内存类型以及操作系统分配给这些类型的物理内存(工作集)数量的细分。有意义。但我还是不明白为什么他们要把它放在那样的地方。我猜这与同一虚拟内存空间中的独立堆栈线程有关。所以这里的结论是,你不能期望在窗口进程内存中有一个清晰的布局,对吗?@Phamtrunnghia:一个原因是@NPE答案对我来说更清晰了一点,但感谢你分享了一个有用的工具。