操作系统中的加载程序如何工作?

时间:2015-09-21 06:13:02

标签: assembly operating-system kernel system bootloader

我知道加载程序是一个将程序加载到主内存的程序。那么,这实际上是如何运作的?究竟发生了什么?实际上,当加载程序加载程序时,会创建PCB中的条目,并将程序放入作业池中。如何将程序的可执行代码复制到主存储器?简单地说,如何使用C或C ++将文件的代码加载到主存储器中?

1 个答案:

答案 0 :(得分:7)

这在很大程度上取决于操作系统。我将在这里写的是特定于Linux的,但类似的事情发生在其他操作系统上。

首先,启动fork()调用,有效地创建新进程(以及适当的PCB条目)。下一步是调用exec系统调用,这将完成艰苦的工作。我假设我们在这里谈论ELF可执行文件。

在这种情况下,在认识到这是ELF可执行文件后(通过检查幻数)exec将调用load_elf_binaryhttp://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

资源: