编译
源程序—> 目标模块
连接
目标模块+所需库函数 ---->装入模块
装入
将装入模块装入到内存
绝对装入方式
当前计算机为单道程序技术时使用
此时编译后产生的地址直接就是物理地址(绝对地址)
等于是说目标模块即是装入模块
因为已经知道了物理地址所以不存在地址的转换,直接装入内存即可
可重定位装入方式
多道程序环境下,编译程序不可能预知经编译后所得的目标模块放在内存的哪里。
把在装入时对目标程序中指令和数据地址的修改过程称之为重定位(地址转换)。
又因为地址变换通常是在进程装入时一次完成的,修改以后不会再改变。故又为静态重定位
动态运行时的装入方式
实际情况中,程序在内存中运行时也伴随着位置的移动。
但是静态重定位不能满足这一需求
使用它也就意味着内存中的位置是不变的。
动态运行时的装入程序在把装入模块装入内存中的时候,并不是立即
将逻辑地址转换为物理地址。
而是在推迟到真正运行时才进行
所以装入后的地址都是逻辑地址
此时还应有重定位寄存器的支持
静态链接
程序运行之前,将目标模块和所需库函数事先链接起来,以后不再拆开。
静态链接之后,产生的装入模块称之为可执行文件
需解决的问题:
1.对相对地址进行修改
2.变换外部调用符号
装入时动态链接
边装入边连接
装入内存时,目标模块如果发生外部调用,就寻找到相应的外部模块将其导入到内存中去。
运行时动态链接
程序运行时,应用每一次调用的模块都可能是不一样的。
但是事先我们无法知道将要运行哪个模块,所以只能将所有模块全部导入内存中
显然有的模块到程序结束,都不会运行,这造成了很大的浪费
那么运行时动态链接:
对某些模块推迟到程序调用时才去链接。。等到程序执行之时调用某个模块,就让OS去找到它,导入到内存链接
优点1 便于修改和更新
若发生需要修改或者更新,容易操作
毕竟 个个模块是分开存放的
不像静态链接,很难实现甚至无法实现。
优点2 便于实现对目标模块的共享
静态连接时,每个应用模块都有着其他模块的拷贝
无法实现目标模块的共享
采用装入时动态链接时可以实现目标模块的共享
链接时间不同
静态:装入之前链接
装入时动态:装入时链接
运行时动态:运行时链接