Windows 进程的内存映射是啥样的?
Posted
技术标签:
【中文标题】Windows 进程的内存映射是啥样的?【英文标题】:How does a memory map of a Windows process look like?Windows 进程的内存映射是什么样的? 【发布时间】:2011-08-06 13:11:54 【问题描述】:这可能是一个重复的问题。我想知道windows进程的内存映射是什么样的?我正在寻找细节。请提供博客、文章和其他相关文献的链接。
【问题讨论】:
Windows Internals 这本书是一个很好的信息来源。您还可以使用 VMMap 查看特定进程的布局。 @Luke 这是一个很好的建议(VMMap),你应该把它放在一个答案中。它为您提供了地址空间的漂亮颜色编码表示。 Windows Internals 也是一个不错的建议。 【参考方案1】:我总是喜欢真正能够看到事物,而不仅仅是阅读理论。事实证明,根据this blog post,如果您使用windbg 打开一个程序,即使它没有运行,它仍然会像原来一样映射到地址空间。因此,您的反汇编窗口形象地(不保证将您的代码加载到这些确切地址)以代码的形式向您显示这些地址中的内容:
当然,由于 ASLR,您无法保证这些地址,但它为您提供了一个想法/让您思考:内存地址也只是代码。根据大多数现代计算机实施的Von Neumann 架构,代码和内存存储在相同的(虚拟)空间中。不幸的是,由于没有堆栈、堆等,您无法移动并查看它们。
blog post from Microsoft 为您提供了虚拟地址空间的高级概述。如您所见,其中一半保留给操作系统使用,另一半您可以使用您拥有的任何内容(代码、malloc
调用、堆栈分配等)来填充。
关于地址空间在用户端的工作方式,this diagram 帮助我理解了它。它链接了in this question,它提供了一系列关于各种可能地图的体面链接。但请记住,内存中的布局会因部件而异。
要记住的重要一点是,所有这些,程序、数据、堆栈、堆、内核的东西,都是一大串连续的内存地址,尽管这些可能会或可能不会真正转换为实际的内存地址。
您可能还对可执行文件在磁盘上的显示方式感兴趣。 This article 和 this article particularly 提供了对 PE 文件格式的一些深入分析。后一篇文章还有一个小图,大致显示了数据是如何映射的。
【讨论】:
以上是关于Windows 进程的内存映射是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章
API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?