cla*_*aws 16 memory assembly operating-system process
我参加了三星的采访.他们询问了很多关于程序内存布局的问题.我对此几乎一无所知.
我用Google搜索了"可执行程序的内存布局"."进程的内存布局".
我很惊讶地看到关于这些主题的信息不多.大多数结果都是论坛查询.我只是想知道为什么?
这些是我发现的几个链接:
我想从一本正确的书而不是一些网络链接中学到这一点.(兰迪海德也是一本书,但还有一本书).我可以在哪本书中找到关于这个主题的清晰和更多信息?
我也想知道,为什么操作系统书没有在他们的书中涵盖这一点?我读了第6版的摊位.它只是讨论了过程控制块.
整个布局的创建是对的任务linker
吗?我在哪里可以阅读有关此过程的更多信息 我想要从磁盘上的程序到处理器上执行的完整信息.
编辑:
最初,即使在阅读下面给出的答案后,我也不清楚.最近,我在看完这些文章之后看到了这些文章,我明白了.
帮助我理解的资源:
- www.tenouk.com/Bufferoverflowc/Bufferoverflow1b.html
- 5部分PE文件格式教程:http://win32assembly.online.fr/tutorials.html
- 优秀文章:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html
- PE Explorer:http://www.heaventools.com/
是的,"可执行程序的布局(PE/ELF)"!="进程的内存布局").在第3个链接中找到自己.:)
在清除了我的概念后,我的问题让我看起来很愚蠢.:)
加载的方式非常依赖于操作系统和使用的二进制格式,细节可能会变得很糟糕.有关二进制文件如何布局的标准,但它实际上取决于操作系统如何布置进程的内存.这可能是文档很难找到的原因.
回答你的问题:
可执行代码由编译器和链接器创建,但它是将操作系统放入操作系统所需的二进制格式的链接器.在Linux上,这种格式通常是ELF,在Windows和较旧的Unix上它是COFF,在Mac OS X上它是Mach-O.不过,这不是一个固定的清单.一些操作系统可以并且确实支持多种二进制格式.链接器需要知道输出格式以创建可执行文件.
该进程的内存布局与二进制格式非常相似,因为许多二进制格式的设计mmap'd
使得加载器的任务更容易.
这不是很简单,虽然.二进制格式的某些部分(如静态数据)不直接存储在二进制文件中.相反,二进制文件只包含这些部分的大小.当进程加载到内存中时,加载器知道分配适当的内存量,但二进制文件不需要包含大的空部分.
这实际上只是揭示了二进制文件如何加载的表面,并没有涉及动态库的任何内容.有关如何动态链接和加载工作的详细处理,请阅读如何编写共享库.