Memory 有关可执行程序(进程)内存布局的更多信息
我参加了三星的面试。他们问了很多关于程序内存布局的问题。我对这件事几乎一无所知 我在谷歌上搜索到“可执行程序的内存布局”。“进程的内存布局” 我惊讶地发现,关于这些主题的信息并不多。大多数结果都是论坛查询。我只是想知道为什么 以下是我找到的几个链接: 我想从一本合适的书而不是一些网络链接中学到这一点。在哪本书中我可以找到关于这个主题的清晰和更多的信息 我还想知道,为什么操作系统的书没有在他们的书中提到这一点?我读了第六版《失速》。它只是讨论过程控制块 整个版面的创建是链接器的任务,对吗?我在哪里可以了解更多有关此过程的信息。我想要从磁盘上的程序到在处理器上执行的完整信息 编辑: 起初,即使在阅读了下面给出的答案后,我也不清楚。最近,我读了这些文章后,发现它们,我很清楚地理解了事情 帮助我理解的资源:Memory 有关可执行程序(进程)内存布局的更多信息,memory,assembly,process,operating-system,Memory,Assembly,Process,Operating System,我参加了三星的面试。他们问了很多关于程序内存布局的问题。我对这件事几乎一无所知 我在谷歌上搜索到“可执行程序的内存布局”。“进程的内存布局” 我惊讶地发现,关于这些主题的信息并不多。大多数结果都是论坛查询。我只是想知道为什么 以下是我找到的几个链接: 我想从一本合适的书而不是一些网络链接中学到这一点。在哪本书中我可以找到关于这个主题的清晰和更多的信息 我还想知道,为什么操作系统的书没有在他们的书中提到这一点?我读了第六版《失速》。它只是讨论过程控制块 整个版面的创建是链接器的任务,对吗?我
在澄清了我的概念之后,我的问题让我看起来很愚蠢 加载方式在很大程度上取决于操作系统和所使用的二进制格式,细节可能会变得棘手。二进制文件的布局有一些标准,但进程内存的布局实际上取决于操作系统。这可能就是文档很难找到的原因 回答您的问题:
- 如果您对进程如何布局内存感兴趣,请查看。第3章讨论过程描述符、创建过程和销毁过程李>
- 我所知道的唯一一本详细介绍链接和加载的书是John Levine写的。有在线版和印刷版,所以请查看。
这实际上只是触及了二进制文件加载方式的表面,并没有涉及任何关于动态库的内容。要了解动态链接和加载的工作原理,请阅读。这里有一种方法可以从文件(*nix)执行程序
- 创建该进程(例如fork())。这为新进程提供了自己的内存映射。这包括内存某个区域中的堆栈(通常位于内存中较高的某个位置)
- 新进程调用exec()以用新的可执行文件替换当前的可执行文件(通常是shell)。通常,新的可执行文件.text(可执行代码和常量)和.data(r/w初始化变量)是为请求页映射而设置的,也就是说,它们根据需要映射到进程内存空间。通常,先是.text部分,然后是.data。.bss部分(未初始化变量)通常分配在.data部分之后。很多时候,当第一次访问包含bss变量的页面时,它被映射为返回一个由零组成的页面。堆通常从.bss节之后的下一页边界开始。然后,堆在内存中长大,而堆栈在内存中长大(记得我说过,通常会有例外!)
在没有内存管理单元的系统中,请求分页通常不可用,但通常使用相同的内存布局。汇编编程的艺术这在DOS、Windows和Unix之间会有些不同,在Unix的风格之间也可能有所不同。你应该说得更具体些,我不在乎“多少”。为一个操作系统学习应该为所有其他操作系统提供概述,对吗?无论如何,我会选择WINDOWS。无法访问linuxforums数据库。请稍后重试链接2和3已断开,常量存储在--section中。全局变量存储在--节中。静态变量存储在--节等中。是否仅依赖于操作系统?有没有关于
如何提供此类节的标准?它们是什么?哪些内容进入哪个部分?
。如果没有任何标准。为什么人们会问这样的问题(特别是在采访中):(这是二进制格式的标准,但在流程布局方面不是标准的。如果你是inter,请查看ELF或其他二进制规范