操作系统理论 第四章(存储器管理)—第二节(程序的装入和链接)

写在前面:

  1. 本系列笔记主要以《计算机操作系统(汤小丹…)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
  2. 视频链接:操作系统(汤小丹等第四版)_哔哩哔哩_bilibili

一、用户程序进入系统运行的步骤

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

        ①编译:由编译程序将用户源代码编译成若干个目标模块。

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

        ③装入:由装入程序将装入模块装入内存。

二、程序的装入

1、绝对装入方式

(1)当计算机系统很小,且仅能运行单道程序时,完全有可能知道程序将驻留在内存的什么位置,此时可以采用绝对装入方式,用户程序经编译后,将产生绝对地址(即物理地址)的目标代码装入模块被装入内存后,程序中的相对地址(即逻辑地址)与实际内存地址完全相同,故不需对程序和数据的地址进行修改

(2)程序中所使用的绝对地址,可在编译或汇编时给出,也可由程序员赋予。通常是宁可在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。

2、可重定位装入方式

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

(2)在采用可重定位装入方式将装入模块装入内存后,会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同。在装入时对目标程序中指令和数据的修改过程称为重定位;地址变换在装入时一次完成,以后不再改变,称为静态重定位

(3)如下图所示,在用户程序的1000号单元处有一条指令LOAD 1, 2500,该指令的功能是将2500单元中的整数365取至寄存器1。

①若将该用户程序装入到内存的10000~15000号单元而不进行地址变换,则在执行11000号单元中的指令时,它将仍从2500号单元中把数据取至寄存器1,而导致数据错误。

②正确的方法应该是,将取数指令中的地址2500修改成12500,即把指令中的逻辑地址2500与本程序在内存中的起始地址10000相加,才得到正确的物理地址12500;除了数据地址应修改外,指令地址也须做同样的修改,即将指令的逻辑地址1000与起始地址10000相加,得到绝对地址11000。

(4)可重定位装入方式可将装入模块装入到内存中任何允许的位置,但该方式并不允许程序运行时在内存中移动位置,因为程序在内存中的移动,意味着它的物理位置发生了变化,这时必须对程序和数据的地址(绝对地址)进行修改后方能运行。然而实际情况是,在运行过程中它在内存中的位置可能经常要改变,每次换入后的位置通常是不同的,在这种情况下,就应采用动态运行时装入的方式。

3、动态运行时的装入方式

(1)动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行,因此,装入内存后的所有地址都仍是逻辑地址。

(2)为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。

三、程序的链接

        源程序经过编译后,可得到一组目标模块。链接程序的功能是将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块。

1、静态链接方式

(1)在程序运行前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开,这种事先进行链接的方式称为静态链接方式。这种事先进行链接所形成的一个完整的装入模块,又称为可执行文件,通常都不再把它拆开,要运行时可直接将它装入内存。

(2)将目标模块装配成装入模块时需解决的两个问题:

对相对地址进行修改。如下图所示,在由编译程序所产生的所有目标模块中,使用的都是相对地址,其起始地址都为0,每个模块中的地址都是相对于起始地址计算的,在链接成一个装入模块后,原模块B和C在装入模块的起始地址不再是0,而分别是L和L+M,所以此时须修改模块B和C中的相对地址,即把原B中的所有相对地址都加上L,把原C中所有相对地址都加上L+M。

变换外部调用符号。将每个模块中所用的外部调用符号也都变换为相对地址,如把B的起始地址变换为L,把C的起始地址变换为L+M。

2、装入时动态链接

(1)装入时动态链接是指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。即在装入一个目标模块时,若发送一个外部模块调用时间内,将引起装入程序去找出相应的外部目标模块,并把它装入内存,然后按上图所示的方式修改目标模块中的相对地址。

(2)装入时动态链接方式有以下有点:

便于修改和更新。采用装入时动态链接方式时,由于各目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易的事。

便于实现对目标模块的共享。采用装入时动态链接方式时,OS很容易将一个目标模块链接到几个应用模块上,实现多个应用程序对该模块的共享。

3、运行时动态链接

        运行时动态链接是指对某些模块的链接推迟到执行时才执行,即在执行过程中,当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块上,凡执行过程中未被用到的目标模块,不会调入内存和链接,这样不仅加快程序的装入过程,而且节省大量的内存空间。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值