操作系统10————存储器管理之程序的装入和链接

操作系统10————存储器管理之程序的装入和链接

一.目录

二.程序的运行之前

用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:

  • 编译,由编译程序(Compiler)对用户源程序进行编译,形成若干个目标模块(Object Module);
  • 链接,由链接程序(Linker)将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);
  • 装入,由装入程序(Loader)将装入模块装入内存。

这里写图片描述

  • 逻辑地址(虚地址):CPU所生成的地址
  • 物理地址(实地址):内存单元所看到的地址
  • 逻辑地址空间:由程序所生成的所有逻辑地址的集合
  • 物理地址空间:由逻辑地址所对应的所有物理地址的集合
  • 地址转换或重定位:把逻辑地址转换为物理地址

三.程序的装入

为了阐述上的方便,我们先介绍一个无需进行链接的单个目标模块的装入过程。该目标模块也就是装入模块。在将一个装入模块装入内存时,可以有如下三种装入方式:

1. 绝对装入方式(Absolute Loading Mode)

当计算机系统很小,且仅能运行单道程序时,完全有可能知道程序将驻留在内存的什么位置。此时可以采用绝对装入方式。用户程序经编译后,将产生绝对地址(即物理地址)的目标代码。

2. 可重定位装入方式(Relocation Loading Mode)

绝对装入方式只能将目标模块装入到内存中事先指定的位置,这只适用于单道程序环境。而在多道程序环境下,编译程序不可能预知经编译后所得到的目标模块应放在内存的何处。因此,对于用户程序编译所形成的若干个目标模块,它们的起始地址通常都是从0开始的,程序中的其它地址也都是相对于起始地址计算的。 因此不能采用绝对装入的方式,而应采用可重定位的装入方式。

可重定位装入方法就是按照内存的具体情况,把模块装入到内存适当位置。此时就会产生逻辑地址和物理地址的不同,将逻辑地址更改为物理地址就是重定位。

这里写图片描述

3. 动态运行时的装入方式(Dynamic Run-time Loading)

可重定位装入方式可将装入模块装入到内存中任何允许的位置,故可用于多道程序环境。但该方式并不允许程序运行时在内存中移动位置。但是,实际情况是,在运行过程中,它在内存中的位置要经常变换,这种情况就应该采用动态运行时的装入方式。

动态运行时的装入程序再把装入模块装入内存后,并不立即把装入模块的逻辑地址转为物理地址,而是把这种地址转换推迟到真正执行时才进行。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。

四.程序的链接

源程序经过编译后,可得到一组目标模块,链接程序的功能是将这组目标模块以及他所需要的库函数装配成一个完整装入模块。在对目标模块进行链接时,根据进行链接时间不同,可把链接分为下面三种。

1. 静态链接(Static Linking)方式

在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开。在下图中示出了经过编译后所得到的三个目标模块A、B、C,它们的长度分别为L、M和N。在模块A中有一条语句CALL B,用于调用模块B。在模块B中有一条语句CALL C,用于调用模块C。B和C都属于外部调用符号,在将这几个目标模块装配成一个装入模块时,须解决以下两个问题:

  • 对相对地址进行修改
  • 变换外部调用符号。
    这里写图片描述
2. 装入时动态链接(Load-time Dynamic Linking)

这是指将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存,还要按照图上图所示的方式修改目标模块中的相对地址。装入时动态链接方式有以下优点:

(1) 便于修改和更新。  
(2) 便于实现对目标模块的共享。

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

在许多情况下,应用程序在运行时,每次要运行的模块可能是不相同的。但由于事先无法知道本次要运行哪些模块,故只能是将所有可能要运行到的模块全部都装入内存,并在装入时全部链接在一起。显然这是低效的,因为往往会有部分目标模块根本就不运行。比较典型的例子是作为错误处理用的目标模块,如果程序在整个运行过程中都不出现错误,则显然就不会用到该模块。

而运动时动态链接,是对上述链接的改进。即,在执行过程中,当发现一个被调用模块为装入内存是,立即由OS去找到该模块,并将之装入内存,并将链接到调用着模块。凡在执行过程中未被用到的目标模块,都用会被调入内存和被链接到装入模块上,这样不仅能加快程序的装入过程,也可以节省大量的内存空间

五.参考资料

《操作系统第四版》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值