Memory 有关可执行程序(进程)内存布局的更多信息

Memory 有关可执行程序(进程)内存布局的更多信息,memory,assembly,process,operating-system,Memory,Assembly,Process,Operating System,我参加了三星的面试。他们问了很多关于程序内存布局的问题。我对这件事几乎一无所知 我在谷歌上搜索到“可执行程序的内存布局”。“进程的内存布局” 我惊讶地发现,关于这些主题的信息并不多。大多数结果都是论坛查询。我只是想知道为什么 以下是我找到的几个链接: 我想从一本合适的书而不是一些网络链接中学到这一点。在哪本书中我可以找到关于这个主题的清晰和更多的信息 我还想知道,为什么操作系统的书没有在他们的书中提到这一点?我读了第六版《失速》。它只是讨论过程控制块 整个版面的创建是链接器的任务,对吗?我

我参加了三星的面试。他们问了很多关于程序内存布局的问题。我对这件事几乎一无所知

我在谷歌上搜索到“可执行程序的内存布局”。“进程的内存布局”

我惊讶地发现,关于这些主题的信息并不多。大多数结果都是论坛查询。我只是想知道为什么

以下是我找到的几个链接:

  • 我想从一本合适的书而不是一些网络链接中学到这一点。在哪本书中我可以找到关于这个主题的清晰和更多的信息

    我还想知道,为什么操作系统的书没有在他们的书中提到这一点?我读了第六版《失速》。它只是讨论过程控制块

    整个版面的创建是链接器的任务,对吗?我在哪里可以了解更多有关此过程的信息。我想要从磁盘上的程序到在处理器上执行的完整信息

    编辑:

    起初,即使在阅读了下面给出的答案后,我也不清楚。最近,我读了这些文章后,发现它们,我很清楚地理解了事情

    帮助我理解的资源:

  • www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
  • 5部分PE文件格式教程:
  • 优秀文章:
  • PE浏览器:
  • 是,“可执行程序的布局(PE/ELF)”!=“进程的内存布局”)。在第三个链接中为自己找到答案。:)


    在澄清了我的概念之后,我的问题让我看起来很愚蠢

    加载方式在很大程度上取决于操作系统和所使用的二进制格式,细节可能会变得棘手。二进制文件的布局有一些标准,但进程内存的布局实际上取决于操作系统。这可能就是文档很难找到的原因

    回答您的问题:

  • 书籍:
    • 如果您对进程如何布局内存感兴趣,请查看。第3章讨论过程描述符、创建过程和销毁过程
    • 我所知道的唯一一本详细介绍链接和加载的书是John Levine写的。有在线版和印刷版,所以请查看。
  • 可执行代码是由编译器和链接器创建的,但正是链接器将内容以操作系统所需的二进制格式放置。在Linux上,这种格式是典型的,在Windows和较旧的Unix上是,在Mac OS X上是。不过,这不是一个固定的列表。一些操作系统可以而且确实支持多种二进制格式。链接器需要知道创建可执行文件的输出格式

  • 该进程的内存布局与二进制格式非常相似,因为许多二进制格式的设计都是为了使加载程序的任务更简单

    不过,这并不是那么简单。二进制格式的某些部分(如静态数据)不直接存储在二进制文件中。相反,二进制文件只包含这些部分的大小。当进程加载到内存中时,加载程序知道如何分配适当的内存量,但二进制文件不需要包含大的空部分

    此外,进程的内存布局还包括一些用于和的空间,进程的调用帧和动态分配的内存都在这些空间中。它们通常位于大地址空间的两端


  • 这实际上只是触及了二进制文件加载方式的表面,并没有涉及任何关于动态库的内容。要了解动态链接和加载的工作原理,请阅读。

    这里有一种方法可以从文件(*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或其他二进制规范