Windows进程的内存映射如何?

Bru*_*uce 14 windows memory-management low-level memory-layout

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

小智 10

我总是希望能够看到事物,而不仅仅是阅读理论.根据这篇博客文章,事实证明,如果你使用windbg打开一个程序,即使它没有运行,它仍然会被映射到一个地址空间,就好像它一样.因此,您的反汇编窗口比喻(不保证在这些确切的地址加载您的代码)显示您在代码方面的地址:

WinDbg工作

当然,由于ASLR,你不能保证这些地址,但它给你一个想法/让你思考:内存地址也只是代码.根据大多数现代计算机实现的Von Neumann架构,代码和存储器存储在相同(虚拟)空间中.不幸的是,因为没有堆栈,堆等你无法移动并查看那些.

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

就地址空间如何在用户端工作而言,此图表帮助我理解了它.它与这个问题相关联,为不同的可能地图提供了一系列不错的链接.但请记住,内存中的布局在部件方面会有所不同.

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

虽然您正在使用它,但您可能也对可执行文件在磁盘上的显示方式感兴趣.本文本文特别提供了一些PE文件格式的深入分析.后一篇文章还有一个小图,大致显示了mmap的数据.