Skip to content

3.1 程序的加载和链接

Giovanna

About 2456 wordsAbout 8 min

2024-08-31

存储管理概述

  • 操作系统中所谓的存储管理,主要是指对内存的管理。

  • 随着现代技术的发展,内存容量越来越大,但它仍然是一个关键性的、紧缺的资源,尤其是在多道程序环境之中,多个进程需共享内存资源,内存紧张的问题依然突出。

  • 存储管理是操作系统的重要组成部分,能否合理有效地利用内存在很大程度上影响着整个计算机的性能。

存储管理的目的

  • 方便用户使用存储器

  • 提高存储器的利用率

  • 从逻辑上扩充存储器容量

存储管理的基本功能

  • 存储分配和回收

  • 地址变换

  • 存储保护

  • 存储共享

  • 存储器扩充

存储系统的结构

image.png

一、代码转换为进程

高级语言的源代码转化为进程的3个基本步骤

  • 编译

    • 由编译程序(Compiler)将用户源代码编译成若个目标模块(Object Module)。
  • 链接

    • 由链接程序(Linker)将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)。
  • 装入

    • 由装入程序(Loader)将装入模块装入物理内存。

image.png

二、空间

1. 空间分类

名空间

用汇编语言或高级语言编写程序时,常常用符号名来访问某一单元。把程序中由符号名组成的程序空间称为符号名空间,简称名空间。

逻辑空间

由源程序经过汇编或编译后,形成目标程序,每个目标程序都是以0为基址顺序进行编址的,原来用符号名访问的单元用具体的数据——单元号取代。这样生成的目标程序占据一定的地址空间,称为逻辑地址空间,简称逻辑空间。在逻辑空间中每条指令的地址和指令中要访问的操作数地址统称为逻辑地址

内存空间(物理空间)

  • 内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。

  • 内存地址的集合称为内存地址空间(或物理地址空间),简称内存空间(或物理空间)。

  • 一维线性空间,编址顺序为0,1,2,3,…… n-1,n的大小由实际组成存储器的存储单元个数决定。比如,64K内存的空间编号为0,1,2,3,……65535。

2. 空间之间的关系

image.png

示例

image.png

3. 空间转化过程

image.png

4. 地址映射

将逻辑地址转换为运行时由机器直接寻址的物理地址。

  • 当程序装入内存时,操作系统要为该程序分配一个合适的内存空间。

  • 由于程序的逻辑地址与分配到的内存物理地址未必一致,CPU执行指令按物理地址进行的,所以要进行地址转换。

  • 重定位(relocation)

三、链接

链接的含义

源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接形成装入模块。

链接方式(链接的时机)

  • 静态链接(Static linking)

  • 装入时动态链接(Load-time Dynamic Linking)

  • 运行时动态链接(Run-time Dynamic Linking)

1. 静态链接

概念

在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开。

静态链接需要解决的两个问题

  • 相对地址的修改

    • 由编译程序产生的所有目标模块中,使用的都是相对地址,其起始地址都为0,在链接成一个装入模块时修改模块的相对地址。
  • 变换外部引用地址

    • 将每个模块中所用的外部调用符号也都变换为相对地址。

静态链接方式示意图

image.png

静态链接方式的缺点

  • 不利于代码共享

  • 不利于模块的独立升级

  • 可能链接一些不会执行的模块,浪费存储空间和处理机时间

2. 装入时动态链接

概念

目标模块在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,将它装入内存并修改模块中的相对地址。

优点

  • 便于各个模块的独立升级

  • 便于实现模块的共享

缺点

  • 可能链接一些不会执行的模块,浪费存储空间和处理机时间

  • 模块装入后不能移动位置

3. 运行时动态链接

概念

对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把它链接到调用者模块上。

优点

凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。

四、装入

装入的任务

  • 将可装入模块装入内存

  • 地址重定位

    • 将执行文件中的逻辑地址转化为内存物理地址的过程

装入方式分类

地址映射建立方式

  • 绝对装入方式

  • 可重定位(静态重定位)装入方式

  • 运行时重定位(动态重定位)装入方式

1. 绝对装入方式

概念

  • 在编译时就知道程序将驻留在内存中的具体位置,编译程序产生绝对地址的目标代码

  • 绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块在装入内存时,由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改

  • 为了便于程序的修改,对编译的程序采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址

示例

image.png

优缺点

  • 绝对装入方式的优点

    • 实现简单,无须进行逻辑地址到物理地址的变换
  • 绝对装入方式的缺点

    • 程序每次必须装入同一内存区
    • 程序员必须事先了解内存的使用情况,根据内存情况确定程序的逻辑地址
    • 不适于多道程序系统

2. 可重定位装入方式

概念

  • 编译时采用相对地址,即编译器假设是装入到从开始的内存位置

  • 允许将程序装入与逻辑地址不同的物理内存空间。即程序可以装入到内存的任何位置,其逻辑地址与装入内存后的物理地址无直接关系

  • 必须进行重定位,即装入程序根据装入的位置将逻辑地址转换为物理地址

  • 静态重定位技术:地址映射在程序装入时进行,以后不再更改程序地址

示例

image.png

优缺点

  • 可重定位装入方式的优点

    • 易实现,无需硬件支持
  • 可重定位装入方式的缺点

    • 程序重定位后就不能移动,因而不能重新分配内存,不利于内存的有效利用
    • 程序在存储空间中只能连续分配,不能分布在内存的不同区域
    • 难于共享

3. 运行时重定位装入方式

概念

  • 程序的地址转换不是在装入时进行,而是在程序运行时动态进行

  • 运行时动态装入需要硬件支持,即重定位寄存器,用于保存程序在内存中的起始地址

  • 程序被执行时,通过重定位寄存器内的起始物理地址和指令或数据的逻辑地址计算其物理地址

示例

image.png

优缺点

  • 运行时重定位装入方式的优点

    • 程序不必连续存放在内存中,可分散存储,可移动
    • 便于共享
    • 对于存储器紧缩、解决碎片问题极其有利
    • 主流方式
  • 缺点

    • 需要硬件支持,实现存储管理的软件算法比较复杂
    • 同一地址,可能多次转换

4. 小结

  • 绝对装入(编译时执行):编译时就知道进程将在内存中的驻留地址,生成绝对代码→即在可执行文件中记录内存地址,装入时直接定位在该内存地址。

    • 如果将来开始地址发生变化,就必须重新编译代码。
  • 可重定位装入(加载时执行:静态地址重定位):地址绑定在装入内存时才进行。系统根据内存当时的使用情况,决定将目标代码放在内存的什么位置。

    • 不允许程序在内存中移动。
  • 动态执行时装入(执行时执行:动态地址重定位):地址绑定延迟到执行时才进行。

    • 支持执行时进程在内存中移动