我知道加载程序是一个将程序加载到主内存的程序。那么,这实际上是如何运作的呢?到底发生了什么?实际上,当加载程序加载程序时,会在 PCB 中创建一个条目,并将程序放入作业池中。程序的可执行代码如何复制到主存?简单来说,如何使用 C 或 C++ 将文件的代码加载到主内存?
这很大程度上取决于操作系统。我在这里要写的是 Linux 特定的内容,但类似的事情也会发生在其他操作系统上。
首先,fork()
发起调用,有效地创建新流程(以及适当的 PCB 条目)。下一步是调用exec
系统调用将完成艰苦的工作。我假设我们在这里讨论的是 ELF 可执行文件。
在这种情况下,在识别出这是 ELF 可执行文件后(通过检查幻数)exec
将会通知load_elf_binary
(http://lxr.free-electrons.com/source/fs/binfmt_elf.c#L664)
论点struct linux_binprm *bprm
传递给此函数的包含有关二进制文件的所有元数据(已由exec
)例如可执行文件名称、环境信息等(http://lxr.free-electrons.com/source/include/linux/binfmts.h#L14)
ELF程序加载是一项复杂的任务,需要了解ELF格式。
可以找到这方面非常好的资源here
简而言之,这些是内核正在执行的有趣步骤:
检查 elf 标头以查找是否有为此二进制文件指定的程序解释器(ld.so
用于动态链接所需的库、执行重定位、调用链接库的初始化函数)。
设置新的可执行环境(例如,设置新凭据、标记不返回点)
设置内存布局(例如随机化堆栈)并将页面从可执行文件映射到内存
Calls start_thread
并启动程序或解释器(ld.so
)
可以找到关于用解释器理解 elf 的好文档here
资源:
- https://www.cs.stevens.edu/~jschauma/631/elf.html
- http://www.skyfree.org/linux/references/ELF_Format.pdf
- https://stackoverflow.com/a/31394861/133707
- http://s.eresi-project.org/inc/articles/elf-rtld.txt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)