《软件技术基础》之《程序的链接和装入》
存储管理的目的:为多道程序的运行提供良好的环境
存储管理的基本功能:
存储系统的结构
程序的链接和装入
高级语言的源代码转化为进程的3个基本步骤
链接:
- 静态链接
- 装入时链接
- 运行时链接
装入:
- 绝对装入
- 静态装入
- 动态装入
空间分类
名空间:用汇编语言或高级语言编写程序时,常常用符号名来访问某一单元。把程序中由符号名组成的程序空间称为符号名空间, 简称名空间。
逻辑空间:由源程序经过汇编或编译后,形成目标程序,每个目标程序都是以0为基址顺序进行编址的,原来用符号名访问的单元用具体的数据——单元号取代。这样生成的目标程序占据一定的地址空间,称为逻辑地址空间,简称逻辑空间。在逻辑空间中每条指令的地址和指令中要访问的操作数地址统称为逻辑地址。
内存空间(物理空间):
- 内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。
- 内存地址的集合称为内存地址空间(或物理地址空间),简称内存空间(或物理空间)。
- 一维线性空间,编址顺序为0,1,2,3,…… n-1,n的大小由实际组成存储器的存储单元个数决定。比如,64K内存的空间编号为0,1,2,3,……65535。
空间之间的关系:
空间之间的关系示例:
空间转化过程
地址映射
将逻辑地址转换为运行时由机器直接寻址的物理地址。
链接
链接的含义
源程序经过编译后,可得到一组目标模块,再利用链接程序将这组目标模块链接形成装入模块。
链接方式(链接的时机)
- 静态链接(Static linking)
- 装入时动态连接(Load-time Dynamic Linking)
- 运行时动态链接(Runtime Dynamic Linking)
静态链接
在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装配模块(又称执行模块),以后不再拆开。
静态链接需要解决的两个问题:
- 相对地址的修改
由编译程序产生的所有目标模块中,使用的都是相对地址,其起始地址都为0,在链接成一个装入模块时修改模块的相对地址。 - 变换外部引用地址
将每个模块中所用的外部调用符号也都变换为相对地址。
静态链接方式示意图:
静态链接方式的缺点:
- 不利于代码共享;
- 不利于模块的独立升级;
- 可能链接一些不会执行的模块,浪费存储空间和处理机时间。
装入时动态链接
目标模块在装入内存时,采用边装入边链接的链接方式。
装入时动态链接方式的优点:
- 便于各个模块的独立升级;
- 便于实现模块的共享。
装入时动态链接方式的缺点:
- 可能链接一些不会执行的模块,浪费存储空间和处理机时间;
- 模块装入后不能移动位置。
运行时动态链接
对某些目标模块的链接,是在程序执行中需要该目标模块时,由操作系统去找到该模块并将之装入内存,随后把它链接到调用者模块上。
运行时动态链接方式的优点:
凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,这样不仅可加快程序的装入过程,而且可节省大量的内存空间。
装入
装入的任务
- 将可装入模块装入内存;
- 地址重定位:将执行文件中的逻辑地址转化为内存物理地址的过程。
装入方式分类(地址映射建立方式)
- 绝对装入方式
- 可重定位(静态重定位)装入方式
- 运行时重定位(动态重定位)装入方式
后两种装入方式合称为 重定位装入方式
绝对装入方式
- 在编译时就知道程序将驻留在内存中的具体位置,编译程序产生绝对地址的目标代码。
- 绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块在装入内存时,由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改。
- 为了便于程序的修改,对编译的程序采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
绝对装入方式示例:
绝对装入方式的优点:
- 实现简单,无须进行逻辑地址到物理地址的变换。
绝对装入方式的缺点:
- 程序每次必须装入同一内存区;
- 程序员必须事先了解内存的使用情况,根据内存情况确定程序的逻辑地址;
- 不适于多道程序系统。
可重定位(静态重定位)装入方式
- 编译时采用相对地址,即编译器假设是装入到从零开始的内存位置;
- 允许将程序装入与逻辑地址不同的物理内存空间。即程序可以装入到内存的任何位置,其逻辑地址与装入内存后的物理地址无直接关系。
- 必须进行重定位,即装入程序根据装入的位置将逻辑地址转换为物理地址。
静态重定位技术:地址映射在程序装入时进行,以后不再更改程序地址。
可重定位(静态重定位)装入方式示例:
可重定位装入方式的优点:
- 易实现,无需硬件支持。
可重定位装入方式的缺点:
- 程序重定位后就不能移动,因而不能重新分配内存,不利于内存的有效利用;
- 程序在存储空间中只能连续分配,不能分布在内存的不同区域;
- 难于共享。
运行时重定位(动态重定位)装入方式
- 程序的地址转换不是在装入时进行,而是在程序运行时动态进行;
- 运行时动态装入需要硬件支持,即重定位寄存器,用于保存程序在内存中的起始地址;
- 程序被执行时,通过重定位寄存器内的起始物理地址和指令或数据的逻辑地址计算其物理地址。
运行时重定位(动态重定位)装入方式示例:
运行时重定位装入方式的优点:
- 程序不必连续存放在内存中,可分散存储,可移动;
- 便于共享;
- 有利于紧凑、碎片问题的解决;
- 主流方式。
运行时重定位装入方式的缺点:
- 需要硬件支持,实现存储管理的软件算法比较复杂;
- 同一地址,可能多次转换。