16

这可能是一个重复的问题。我想知道windows进程的内存映射是什么样的?我正在寻找细节。请提供博客、文章和其他相关文献的链接。

4

1 回答 1

12

我总是喜欢真正能够看到事物,而不仅仅是阅读理论。事实证明,根据这篇博客文章,如果您使用 windbg 打开一个程序,即使它没有运行,它仍然会像原来一样映射到地址空间。因此,您的反汇编窗口形象地(不保证将您的代码加载到这些确切地址)以代码的形式向您显示这些地址中的内容:

WinDbg 工作

当然,由于 ASLR,您无法保证这些地址,但它给您一个想法/让您思考:内存地址也只是代码。根据大多数现代计算机实施的冯诺依曼架构,代码和内存存储在相同的(虚拟)空间中。不幸的是,由于没有堆栈、堆等,您无法移动并查看它们。

Microsoft 的这篇文为您提供了虚拟地址空间的高级概述。正如您所看到的,其中一半保留给操作系统使用,另一半可以填充您拥有的任何内容(代码、malloc调用、堆栈分配等)。

关于地址空间在用户端的工作方式,这张图帮助我理解了它。它在这个问题中链接,它提供了一系列关于不同可能地图的体面链接。但请记住,内存中的布局会因部件而异。

要记住的重要一点是,所有这些,程序、数据、堆栈、堆、内核的东西,都是一个大的连续的内存地址系列,尽管这些可能会或可能不会真正转换为实际的内存地址。

当您使用它时,您可能还对可执行文件在磁盘上的显示方式感兴趣。这篇文章这篇文章特别提供了一些对PE文件格式的深入分析。后一篇文章还有一个小图,大致显示了数据是如何被映射的。

于 2011-04-15T20:14:48.320 回答