一个Windows进程的内存映射是什么样子的?

19

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


4
《Windows内部书》是这方面的好信息来源。您还可以使用VMMap来查看特定进程的布局。 - Luke
@Luke 这是一个好建议(VMMap),你应该把它放在答案中。它可以为您提供地址空间的漂亮彩色编码表示。Windows Internals 也是一个不错的建议。 - user257111
1个回答

13

我总是喜欢能够看到实物,而不仅是读理论。根据这篇博客文章,即使程序没有运行,如果您使用Windbg打开它,它仍会被映射到一个地址空间中。因此,您的反汇编窗口可以(不能保证以这些确切的地址加载代码)向您显示在那些地址上的代码:

WinDbg working

当然,由于ASLR的缘故,你无法保证这些地址,但它可以给你一个想法 / 让你思考:内存地址也只是代码。代码和内存存储在同一(虚拟)空间中,正如大多数现代计算机实现的冯·诺伊曼结构。不幸的是,由于没有堆栈等,您无法移动和查看它们。

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

关于用户侧地址空间如何工作,这张图帮助我理解了它。它链接在这个问题中,该问题提供了一系列不错的链接,可针对可能的映射进行更多了解。请记住,内存中的布局将因部分而异。

要记住的重点是,所有内容,包括程序、数据、栈、堆、内核等等,都是一个大的连续性内存地址序列,虽然这些地址实际上可能并不一定对应真实的内存地址。

在此过程中,您可能还会对可执行文件在磁盘上的显现方式感兴趣。 这篇文章特别的这篇文章 提供了有关PE文件格式的深入分析。后一篇文章还有一个简单的图示,显示了数据是如何被mmap'd的。


您的链接图表显示404错误。 - user705185

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接