我知道加载程序是一个将程序加载到主内存的程序。那么,这实际上是如何运作的?究竟发生了什么?实际上,当加载程序加载程序时,会创建PCB中的条目,并将程序放入作业池中。如何将程序的可执行代码复制到主存储器?简单地说,如何使用C或C ++将文件的代码加载到主存储器中?
答案 0 :(得分:7)
这在很大程度上取决于操作系统。我将在这里写的是特定于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)< / p>
ELF程序加载是一项复杂的任务,需要了解ELF格式。
可以找到关于此的非常好的资源here
简而言之,这些是内核正在执行的有趣步骤:
检查elf标头以查找是否为该二进制文件指定了程序解释器(ld.so
用于动态链接所需的库,执行重定位,调用链接库的初始化函数)。 / p>
设置新的可执行文件环境(设置新凭据,标记不返回点,例如)
设置内存布局(如随机化堆栈)并将页面从可执行文件映射到内存
致电start_thread
并启动程序或解释程序(ld.so
)
可以找到关于与口译员一起理解精灵的好文件here
资源: