操作系统原理学习笔记(十九)-程序的装入和链接
程序运行前的步骤
- 编译
- 由编译程序(Compiler)对源程序编译,形成若干目标模块(Object Module)
- 链接
- 由链接程序(Linker)将一组目标模块及相关库链接,形成完整的装入模块(Load Module)。
- 装入
- 由装入程序(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)
- 模块的链接推迟到程序执行时运行。
- 未用到的模块不会被调用,节省空间。
共有 0 条评论