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

cla*_*aws 16 memory assembly operating-system process

我参加了三星的采访.他们询问了很多关于程序内存布局的问题.我对此几乎一无所知.

我用Google搜索了"可执行程序的内存布局"."进程的内存布局".

我很惊讶地看到关于这些主题的信息不多.大多数结果都是论坛查询.我只是想知道为什么?

这些是我发现的几个链接:

  1. 运行时存储组织
  2. 运行时内存组织
  3. C进程的内存布局 ^ pdf ^

我想从一本正确的书而不是一些网络链接中学到这一点.(兰迪海德也是一本书,但还有一本书).我可以在哪本书中找到关于这个主题的清晰和更多信息?

我也想知道,为什么操作系统书没有在他们的书中涵盖这一点?我读了第6版的摊位.它只是讨论了过程控制块.

整个布局的创建是对的任务linker吗?我在哪里可以阅读有关此过程的更多信息 我想要从磁盘上的程序到处理器上执行的完整信息.

编辑:

最初,即使在阅读下面给出的答案后,我也不清楚.最近,我在看完这些文章之后看到了这些文章,我明白了.

帮助我理解的资源:

  1. www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
  2. 5部分PE文件格式教程:http://win32assembly.online.fr/tutorials.html
  3. 优秀文章:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
  4. PE Explorer:http://www.heaventools.com/

是的,"可执行程序的布局(PE/ELF)"!="进程的内存布局").在第3个链接中找到自己.:)

在清除了我的概念后,我的问题让我看起来很愚蠢.:)

Tod*_*lin 7

加载的方式非常依赖于操作系统和使用的二进制格式,细节可能会变得很糟糕.有关二进制文件如何布局的标准,但它实际上取决于操作系统如何布置进程的内存.这可能是文档很难找到的原因.

回答你的问题:

  1. 图书:
    • 如果您对进程如何布置内存感兴趣,请查看了解Linux内核.第3章讨论了进程描述符,创建进程和破坏进程.
    • 我所知道的唯一一本涵盖链接和加载的书是John Levine的Linkers和Loaders.有一个在线和印刷版本,所以检查出来.

  2. 可执行代码由编译器和链接器创建,但它是将操作系统放入操作系统所需的二进制格式的链接器.在Linux上,这种格式通常是ELF,在Windows和较旧的Unix上它是COFF,在Mac OS X上它是Mach-O.不过,这不是一个固定的清单.一些操作系统可以并且确实支持多种二进制格式.链接器需要知道输出格式以创建可执行文件.

  3. 该进程的内存布局与二进制格式非常相似,因为许多二进制格式的设计mmap'd使得加载器的任务更容易.

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

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

这实际上只是揭示了二进制文件如何加载的表面,并没有涉及动态库的任何内容.有关如何动态链接和加载工作的详细处理,请阅读如何编写共享库.