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

时间:2013-03-23 03:56:16

标签: 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=0000             efl=00000286

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

有什么东西我不知道吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

  

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

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

特别值得注意的是:

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

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