这可能是一个重复的问题。我想知道windows进程的内存映射是什么样的?我正在寻找细节。请提供博客,文章和其他相关文献的链接。
答案 0 :(得分:10)
我总是希望能够看到事物,而不仅仅是阅读理论。事实证明,根据this blog post,如果你使用windbg打开一个程序,即使它没有运行,它仍然会被映射到地址空间,就像它一样。因此,您的反汇编窗口比喻(不保证在这些确切的地址加载您的代码)显示您在代码方面的地址:
当然,由于ASLR,你不能保证这些地址,但它给你一个想法/让你思考:内存地址也只是代码。根据大多数现代计算机实现的Von Neumann体系结构,代码和内存存储在同一(虚拟)空间中。不幸的是,因为没有堆栈,堆等你无法移动并查看那些。
此blog post from Microsoft为您提供虚拟地址空间的高级概述。正如您所看到的,其中一半保留供操作系统使用,另一半可以填充您拥有的任何内容(代码,malloc
调用,堆栈分配等)。
就地址空间在用户方面的工作方式而言,this diagram帮助我理解了它。它与in this question相关联,为不同的可能地图提供了一系列不错的链接。但请记住,内存中的布局在部件方面会有所不同。
要记住的重要一点是,所有这些,程序,数据,堆栈,堆,内核的东西,都是一大系列的内存地址,尽管这些实际内存地址可能会或可能不会实际转换为实际的内存地址。
虽然您正在使用它,但您可能也对可执行文件在磁盘上的显示方式感兴趣。 This article和this article particularly提供了对PE文件格式的深入分析。后一篇文章还有一个小图,大致显示了数据是如何进行mmap的。