【问题标题】:Operating system-loader操作系统加载器
【发布时间】:2016-11-22 04:54:06
【问题描述】:

我的问题是操作系统如何加载 用户空间应用程序到 RAM。我知道该怎样 当我们第一次打开计算机时,引导加载程序工作 Bios 只需读取 512 kb 数据直到 aa55 引导加载程序签名并将引导加载程序加载到 ram。常规用户空间程序是否以这种方式处理?如果是怎么办?因为引导程序是由bios激活的,而用户空间程序是如何被操作系统处理的?更具体地说, execv() 如何将程序加载到 RAM 并启动用户空间的执行点? 提前致谢

【问题讨论】:

标签: operating-system embedded-linux


【解决方案1】:

用户空间程序不像bios那样处理,内核将参与运行用户空间程序。

一般来说: 当程序在 shell 中执行时,shell 将调用系统调用在新地址空间中创建一个新任务,读取可执行二进制文件并开始执行它。

要了解细节,你需要了解:

  1. 精灵格式。当然还有其他格式可以在 Linux 中使用,elf 只是最常见的一种,也是一个很好的起点。了解 elf 将帮助您了解内核如何将可执行二进制文件精确地加载到内存中。

  2. Linux 进程管理;这将帮助您了解程序是如何开始运行的。

  3. 读取内核中的相关代码。 fs/exec.c 会有很大帮助。

【讨论】:

    【解决方案2】:

    该过程因操作系统而异。一些系统有一个后台命令解释器,它存在于进程的整个生命周期和进程本身中。当程序运行时,命令解释器停留在后台(在用户模式访问受保护)。当程序完成后,命令解释器进入前台,可以在同一个进程中运行另一个程序。

    在太监世界中,命令解释器只是一个用户模式程序。每当它运行一个程序时,它就会启动另一个进程。

    这两种类型的系统都使用加载程序来配置进程地址空间以运行程序。可执行文件是一组定义如何布局地址空间的指令,

    这与引导加载程序有很大不同。引导加载程序盲目地将存储的数据块加载到内存中。程序加载器包含用于布置进程地址空间的复杂指令,包括处理共享库和进行地址修复。

    【讨论】:

    • 你能给出任何示例代码吗?所以我可以看到程序是如何插入到内存中的?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2011-09-05
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多