操作系统原理学习笔记(十九)-程序的装入和链接

文章首发及后续更新:https://mwhls.top/1301.html
新的更新内容请到mwhls.top查看。
无图/无目录/格式错误/更多相关请到上方的文章首发页面查看。

程序运行前的步骤

  1. 编译
    • 由编译程序(Compiler)对源程序编译,形成若干目标模块(Object Module)
  2. 链接
    • 由链接程序(Linker)将一组目标模块及相关库链接,形成完整的装入模块(Load Module)。
  3. 装入
    • 由装入程序(Loader)将装入模块装入内存。

程序的装入

  • 绝对装入方式(Absolute Loading Mode)
    • 已知用户进程驻留地址R,目标模块从R上向上扩展。
    • 相对地址(逻辑地址)与实际内存地址相同。
    • 一般在OS小,仅能运行单道程序时使用。
  • 可重定位装入方式(Relocation Loading Mode)
    • 起始地址通常由0开始,根据内存具体情况将装入模块装入内存适当位置。
    • 装入时对目标程序中指令和数据地址的修改过程称为重定向。
      • 地址变换通常在进程装入时一次完成,因此称为静态重定位。
    • 可用于多道程序环境。
  • 动态运行时的装入方式(Dynamic Run-time Loading)
    • 允许程序运行时在内存中改变位置。
    • 装入程序将地址转换推迟到程序执行时才运行。
    • 为了地址转换不影响指令执行速度,需要重定位寄存器的支持。

程序的链接

  • 静态链接方式(Static Linking)
    • 将目标模块及库函数链接成完整的装配模块,不再拆开。
    • 包括两个过程:
      • 对相对地址修改。
      • 变换外部调用符号。
    • 例如,三个模块ABC按顺序链接,长度为L,M,N:
      • A相对地址为0,B为L,C为L+M。
      • 将外部调用符号变换成上述的相对地址。
  • 装入时动态链接(Load-time Dynamic Linking)
    • 目标模块边装入内存,边进行链接。
      • 即,发生一个外部模块调用事件,装入程序去找到相应外部目标模块,装入内存,再修改相对地址。
    • 优点:
      • 便于修改与更新。
        • 各目标模块分开存放,不需要拆开。
      • 便于实现对目标模块的共享。
        • 静态链接中,每个应用模块都需要有目标模块备份,而该链接方式可将一个目标模块链接多个应用模块
  • 运行时动态链接(Run-time Dynamic Linking)
    • 模块的链接推迟到程序执行时运行。
    • 未用到的模块不会被调用,节省空间。

你可能感兴趣的:(计算机理论,操作系统)