操作系统中的加载程序如何工作? [关闭]

2023-11-22

我知道加载程序是一个将程序加载到主内存的程序。那么,这实际上是如何运作的呢?到底发生了什么?实际上,当加载程序加载程序时,会在 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(使用前将#替换为@)

操作系统中的加载程序如何工作? [关闭] 的相关文章

随机推荐

  • 错误 LNK1104:无法打开文件“Debug\MyProjectLib.lib”

    我有以下内容CMakeLists txt文件来生成我的基于Qt的项目 cmake minimum required VERSION 2 8 12 project MyProject find package Qt5Widgets set M
  • React-Style、Webpack、React - 未捕获错误:不变违规:`style` 属性

    我的浏览器中出现以下错误 未捕获的错误 不变违规 styleprop 期望从样式属性到值的映射 而不是字符串 例如 使用 JSX 时 style marginRight spaces em 这是运行 webpack dev server 并
  • 如何使用 Python 创建文件路径的 zip 文件(包括空目录)?

    我一直在尝试使用zipfile and shutil make archive递归创建目录的 zip 文件的模块 这两个模块都工作得很好 除了空目录不会添加到存档中 包含其他空目录的空目录也会被静默跳过 我可以使用 7Zip 创建相同路径的
  • 使用 Powershell 从多个 XML 文件中的元素获取数据,以便输出到另一个单个 XML 文件

    首先我要承认我是一个 Powershell 和编码 菜鸟 我摸索着写了一些剧本 但我并没有声称自己有任何接近能力的东西 我希望一些更有经验的人能让我走上正确的道路 我正在尝试从多个 XML 文件中提取特定的元素数据 这些数据将用于填充另一个
  • 了解 DICOM 图像属性以获得轴向/冠状/矢状切割 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我必须用 C 编写一个程序 能够解析 DICOM 并显示轴向 冠状和矢状切割 看起来工作量很大 但我必须这样做 我猜 重要的第一步是理解 DICOM 文件 我一直在读这个教程ht
  • Locale.getDefault() 返回Currency.getInstance 不支持/无效的区域设置

    我的应用程序使用以下代码来获取本地货币 Locale locale Locale getDefault java util Currency localCurrency java util Currency getInstance loca
  • 创建具有预先确定的平均值和标准差的数组

    我正在尝试使用 Numpy 创建一个具有预定平均值和标准差值的数组 该数组需要其中的随机数 到目前为止 我可以生成一个数组并计算平均值和标准差 但无法让数组受值控制 import numpy as np x np random randn
  • 如何将数组设置为mysql用户变量

    我没想到会发现这如此困难 但我试图在 MySQL 中设置一个用户变量来包含一个值数组 我不知道如何做到这一点 所以尝试做一些研究 但很惊讶没有找到答案 我努力了 SET billable types client1 client2 clie
  • 将数据从 csv 转换为动态列表 (Flutter)

    我创建了一个加载 CSV 文件并将其显示为列表视图的应用程序 我使用了以下示例 https gist github com Rahiche 9b4b2d3b5c24dddbbe662b58c5a2dcd2 问题是我的列表不生成行 I flu
  • 如何在另一个 git 存储库中提交 git 存储库

    我正在开发一个使用 git 的应用程序 因此我需要测试它与 git 的集成 在我的 git 存储库中 我需要另一个存储库 my git repo tests another repo 在没有 git 子模块的情况下如何提交它 我不想为一个文
  • 检查 Selenium 中是否存在 Element

    我想检查 Selenium 中是否存在某个元素 如果存在 则为其分配一个名称 现在我有一些看起来像这样的东西 IWebElement size9 driver FindElement By CssSelector a data value
  • 观察者模式与反应器模式

    我一直在研究两者 但找不到任何真正的区别 我错过了什么吗 在网络上 有些人说观察者应该只处理一个事件 而反应器应该处理很多事件 但我不认为这是一个真正的区别 因为反应器可以像许多观察者一样被看到 有什么区别吗 或者新名称 Reactor 只
  • OpenReadStream 允许的最大大小

    OpenReadStream 允许的最大大小是多少 现在 使用 10MB 但我认为必须有一定的上限 可以带GB吗 在 ASP NET Core 5 0 中 上传文件的框架文件大小限制为 2 GB 但是 从 ASP NET Core 6 0
  • C 中的局部结构

    如果一个结构体仅在一个函数中使用 我可以在该函数中声明它吗 我可以这样做吗 int func struct int a b s s a 5 return s a gcc 被它噎住了 但它发出了一个看起来非常奇怪的错误 我无法理解 而不是说
  • 涉及多个表的外键约束

    我在 Postgres 9 3 数据库中有以下场景 表 B 和 C 参考表 A 表 C 有一个引用表 B 的可选字段 我想确保对于表 C 中引用表 B 的每一行 c b a c a 也就是说 如果 C 引用了 B 则两行应指向表 A 中的同
  • Google Calendar V3 REST API 中的批量请求

    如何通过 V3 REST API 使用批量请求获取 添加 更新 Google 日历事件 我已经尝试过 但不起作用 根据文档 https developers google com google apps calendar batch 应该可
  • Chrome 用户脚本是否像 Greasemonkey 脚本一样与全局命名空间分离?

    我知道 Greasemonkey 脚本自动包装在匿名函数中 以某种方式隔离 以防止它们与页面中的脚本发生冲突 Chrome 用户脚本也会发生同样的情况吗 是的 Greasemonkey 脚本是通常封装在匿名函数中 And Chrome 用户
  • C++中NULL和False一样吗

    在 C gcc VS 中 NULL 被视为与 False 相同 或者更重要的是 如果在逻辑语句中 NULL 的计算结果是什么 还有许多其他问题 但没有专门针对 C 的问题 由于某种原因 使用 NULL 控件循环 for 只会冻结程序 表明
  • 在 bash 中指定两个文件扩展名完成

    我正在尝试修改 bash 完整属性 我可以这样排除命令的文件扩展名 complete f X hi vim 我想指定两个文件名进行排除 我该怎么做呢 注意 以下命令不起作用 complete f X hi o vim 一种方法是打开扩展的全
  • 操作系统中的加载程序如何工作? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我知道加载程序是一个将程序加载到主内存的程序 那么 这实际上是如何运作的呢 到底发生了什么 实际上 当加载程序加载程序时 会在 PCB 中创建一个条目 并将程序放入作业池中 程序