我总是喜欢实际看到的东西,而不只是读理论.事实证明,根据
this blog post,如果您使用windbg打开程序,即使它不运行,仍然映射到地址空间,就像它一样.因此,您的反汇编窗口比喻(不保证在这些确切的地址加载您的代码)显示这些地址在代码方面是什么:
当然,由于ASLR,您不能保证这些地址,但它给您一个想法/让您思考:内存地址也只是代码.根据大多数现代计算机实现的Von Neumann架构,代码和内存存储在相同(虚拟)空间中.不幸的是,因为没有堆栈,堆等你不能移动,看看那些.
此blog post from Microsoft为您提供了虚拟地址空间的高级概述.正如你所看到的,其中一半被保留供操作系统使用,另一半可以填充任何内容(代码,malloc调用,堆栈分配等).
关于地址空间在用户端的工作方式,this diagram帮助我理解了.它链接了in this question,它为不同的可能的地图提供了一系列体面的链接.记住,内存中的布局将在部件方面有所不同.
要记住的一个重要的一点是,所有这些,程序,数据,堆栈,堆,内核的东西都是一个大的顺序系列的内存地址,尽管这些可能或可能不会实际转化为实际的内存地址.
尽管如此,您可能也会对可执行文件在磁盘上的显示感兴趣. This article和this article particularly提供了一些对PE文件格式的深入分析.后一篇文章还有一个图表,大致显示了数据是毫米.