Windows进程的内存映射怎么样?

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

我总是喜欢真正能够看到的东西,而不仅仅是阅读理论。 根据这个博客文章 ,事实证明,如果你使用windbg打开一个程序,即使它没有运行,它仍然被映射到一个地址空间,就好像它一样。 因此,你的反汇编窗口(不保证加载你的代码在这些确切的地址)显示你在这些地址是什么在代码:

WinDbg工作

当然,由于ASLR你不能保证这些地址,但它给了你一个想法/让你思考:内存地址也只是代码。 代码和内存按照大多数现代计算机所实现的冯·诺依曼架构存储在相同的(虚拟)空间中。 不幸的是,因为没有堆栈,堆等,你不能移动,看看那些。

Microsoft的这篇博客文章为您提供了虚拟地址空间的高级概览。 正如你所看到的,其中一半是为操作系统保留的,另一半则可以填充你拥有的任何东西(代码, malloc调用,堆栈分配等等)。

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

需要记住的重要一点是,所有的程序,数据,堆栈,堆,内核的东西,都是一个大的连续的内存地址序列,尽管这些地址实际上可能转化为实际的内存地址。

同时你也可能对可执行文件在磁盘上的显示方式感兴趣。 本文和本文特别提供了一些PE文件格式的深入分析。 后面的文章也有一个小图,大致显示了数据是如何映射的。