程序的装入与链接
用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可执行的程序,对用户程序的处理步骤可分为三步(编译、链接、装入):
程序的编译
程序的链接
源程序经过编译后,可得到一组目标模块。链接程序的功能是将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块。在对目标模块进行链接时,根据链接的时间不同,可将链接方式分成三种。
静态链接方式
静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
装入时动态链接
装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
运行时动态链接
运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
程序的装入
绝对装入方式
绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存,即编译、链接后得到的装入模块的指令直接就使用了绝对地址。而绝对装入只适用于单道程序环境。
需要注意的是,程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。通常情况下都是编译或汇编时再转换为绝对地址。
可重定位装入方式
静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
如上图中,装入的起始物理地址为10000,则所有地址相关的参数都加10000,所以变量从逻辑地址2500变为物理地址12500。
静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间,因为指令中使用的地址在装入时就已经确定了。
动态运行时的装入方式
动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持,用重定位寄存器来存放装入模块存放的起始位置,当执行指令时,指令中的目标逻辑地址将与重定位寄存器中的起始位置相加,以此来得到对应的物理地址。
采用动态重定位时,允许程序在内存中发生移动,即发生移动时,只需要修改重定位寄存器中对应的起始位置的值。
动态重定位的特性:可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。