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

标签 memory assembly process operating-system

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

我用谷歌搜索了“可执行程序的内存布局”。 “进程的内存布局”。

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

这些是我找到的几个链接:

  1. Run-Time Storage Organization
  2. Run-Time Memory Organization
  3. Memory layout of C process ^pdf^

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

我也想知道,为什么操作系统的书没有在他们的书中介绍这个?我读了stallings第6版。它只是讨论了过程控制 block 。

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

编辑:

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

帮助我理解的资源:

  1. www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
  2. 5 part PE file format tutorial: http://win32assembly.online.fr/tutorials.html
  3. Excellent article : http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
  4. PE Explorer: http://www.heaventools.com/

是的,“可执行程序的布局(PE/ELF)”!=“进程的内存布局”)。在第 3 个链接中自行查找。 :)

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

最佳答案

加载方式在很大程度上取决于操作系统和使用的二进制格式,而且细节可能会令人讨厌。二进制文件的布局有标准,但进程的内存布局实际上取决于操作系统。这可能是文档很难找到的原因。

回答您的问题:

  1. 书籍:
    • 如果您对进程如何布置内存感兴趣,请查看 Understanding the Linux Kernel .第 3 章讨论了进程描述符、创建进程和销毁进程。
    • 我所知道的唯一一本详细介绍链接和加载的书是 Linkers and Loaders由约翰莱文。有在线版和打印版,请查看。

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

  3. 进程的内存布局与二进制格式非常相似,因为很多二进制格式被设计为mmap'd。让装载机的工作更轻松。

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

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

这实际上只是触及了如何加载二进制文件的皮毛,并没有涉及任何关于动态库的内容。要详细了解动态链接和加载的工作原理,请阅读 How to Write Shared Libraries .

关于memory - 有关可执行程序(进程)的内存布局的更多信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1966920/

相关文章:

c - Valgrind 不喜欢我的 realloc()?

javascript - 在 nodejs 上启动新进程

c - Linux C Shell,子进程抛出段错误

assembly - 程序集 8086 中数组大小未知

c - 缓冲区溢出/溢出解释?

python - mysql python并发访问同一表列

c - realloc 说 Invalid next size

java - 参数对象与长参数列表的性能

r - 在 R 中使用 MNP 包时出现内存泄漏

有人可以帮我解释一下银行选择寄存器的概念吗?