目录
4.2.1 程序的装入
一、绝对装入方式
二 、可重定位装入方式
三、动态运行时装入方式
4.2.2 程序的链接
一、静态链接
二、装入时动态链接
三、运行时动态链接
在多道程序环境下,如果程序要运行,那么必须为之创建进程。而创建进程的第一件事就是要把用户编写好的源程序和数据装入内存。如何将一个用户的源程序变成一个可在内存中执行的程序,通常要经过下列几步:
1、编译
源程序是用高级语言或汇编语言编写的一组程序语句。计算机不能直接执行源程序,它需要被编译程序或解释程序翻译成机器级代码,即目标模块。
2、链接
目标模块是纯二进制的机器级代码。虽然计算机可以执行目标级代码,但是典型的目标模块是不完备的,它还需要包含对其它目标模块或库函数的引用。因此,目标模块通常是不能被装入计算机并执行的,需要首先被链接成一个装入模块。
装入模块是能被装入并执行的完备的机器级代码。这个将目标模块链接成装入模块的过程,是由链接程序(Linker)实现的。
3、装入
装入是指由装入程序将装入模块装入内存并执行。
4.2.1 程序的装入
根据存储空间的分配方式,将一个装入模块装入内存时,可采用三种方式:
一、绝对装入方式
装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,因此不需要对程序和数据的地址进行修改。
通常在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。
二 、可重定位装入方式
- 目标模块中的地址为相对地址,即地址都是相对于0开始的。
- 装入模块中的逻辑地址与实际装入内存的物理地址不同。
重定位:在装入内存时,对相对地址做出相应的修改以得到正确的物理地址。
相对地址是指数据地址和指令地址。
根据地址变换进行的时间及采用技术手段不同,分为:
- 静态重定位
- 动态重定位
静态重定位
- 地址变换是在装入内存时一次性完成的,并且以后不能移动
- 物理地址 = 相对地址 + 内存中的起始地址
适用于多道程序环境,可以将装入模块装入到内存中任何允许的位置
- 优点:不需要硬件地址变换机构支持,可以装入有限多道程序
- 缺点:一个程序通常占用连续的内存空间,装入内存后不能移动,不易实现共享
三、动态运行时装入方式
装入程序将装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序执行时进行。
动态重定位:在硬件地址变换机构的支持下,随着对每条指令或数据的访问自动进行地址变换。
重定位寄存器 RR:将相对地址与 RR 中的内容相加后得到的地址作为访问主存的地址。
采用动态重定位技术后,程序中所有指令和数据的实际地址是在运行过程中最后访问的时刻确定的。
主要优点:
- 对主存的使用更加灵活有效
- 几个作业共享一程序段的单个副本比较容易
- 有可能向用户提供一个比主存的存储空间大得多的地址空间
主要缺点:
- 需要附加硬件地址变换机构
- 实现存储器管理的软件比较复杂
4.2.2 程序的链接
链接程序的功能:将编译后得到的一组目标模块以及它们所需要的库函数,装配成一个完整的装入模块。根据链接时间的不同,可把链接分成三种:
一、静态链接
在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装入模块,以后不再拆开。装入模块又称为执行模块,或称为可执行文件。
应该是在装入内存之前完成链接的。
说明:将几个目标模块链接成一个装入模块时,需要解决以下两个问题:
1、对相对地址进行转换:将除第一个模块外的模块的相对地址转换为装入模块中相对地址。
2、对外部调用符号进行转换:将每个模块中所用的外部调用符号,都转换为相对地址。
例如将 call B 变换为 JSR “L”
二、装入时动态链接
用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的。即在装入一个目标模块时,若发生一个外部模块调用,将引起装入程序去找出相应的外部目标模块,并将其装入内存。
优点:
1、便于软件版本的修改和更新。对于经静态链接装配在一起的装入模块,如果要修改或更新其中的某个目标模块,则要求重新打开装入模块。这不仅是低效的,而且有时是不可能的。若采用动态链接方式,由于各目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易得事。
2、便于实现目标模块共享。即可以将一个目标模块链接到几个应用模块中,从而实现多个应用程序对该模块的共享。
三、运行时动态链接
将对某些目标模块的链接推迟到程序执行时才进行,即在执行过程中,若发现一个被调用模块尚未装入内存时,立即由 OS 去找到该模块,将它装入内存,并链接到调用模块上。
优点:执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,不仅可加快程序的装入过程,而且可节省大量的内存空间。