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

pro*_*481 3 assembly operating-system kernel system bootloader

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

Nem*_*ric 8

这在很大程度上取决于操作系统.我将在这里写的是特定于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格式.

可以在这里找到非常好的资源

简而言之,这些是内核执行的有趣步骤:

  • 检查elf标头以查找是否为该二进制文件指定了程序解释器(ld.so用于动态链接所需的库,执行重定位,调用链接库的初始化函数).

  • 设置新的可执行环境(设置新凭据,标记不返回点,例如)

  • 设置内存布局(如随机化堆栈)并将页面从可执行文件映射到内存

  • 调用start_thread并启动程序或解释器(ld.so)

有关口译员对精灵的理解的好文件可以在这里找到

资源: