表-程序的编译、链接和装入 |
编译 | 作用 | 得到多个相对/逻辑地址(地址空间),每个模块一个。 |
| |
链接 | 作用 | 得到一个相对/逻辑地址(地址空间),每个程序(进程)一个。 |
方式 | 静态链接 | 程序运行前,将各个目标模块及所需的库函数,连接成一个完整的装入模块,以后不再拆开。 | 各个模块在内存中连续存放,模块无法共享。 |
动态链接 | 装入时动态链接 | 编译得到的各个目标模块,每次装入内存时,边装入边链接,即在装入一个目标模块时,若遇到一个外部模块调用事件(只是在程序中有该调用事件,但在程序实际运行时,该调用事件可能发生,也可能不发生),将引起装入程序去找出相应的外部目标模块,并将它装入内存。 | 各个模块在内存中离散存放,模块可以共享,即一个目标模块可以链接到多个应用模块上。 |
运行时动态链接 | 在程序运行中需要某目标模块时,才对它进行链接,即当发现一个被调用模块尚未装入内存时,立即由OS去找到该模块并将之装入内存,把它链接到调用者模块。 |
装入 | 作用 | 将一个相对/逻辑地址(地址空间)映射到一个绝对/物理地址(内存空间)。 |
方式 | 绝对装入方式 | 实现方式 | 地址变换(符号地址→绝对地址)的绝对地址在编译时产生。 |
适用环境 | 单道程序环境 |
静态重定位装入 | 实现方式 | 地址变换(相对地址→绝对地址)在装入时一次完成。逻辑地址到物理地址的映射在装入之后便不再改变(装入内存后的模块中的地址均是绝对地址,模块在内存中不可移动)。(重定位:即地址空间中的逻辑地址到内存空间中的物理地址的变换过程) |
适用环境 | 多道程序环境 |
动态运行时装入 | 实现方式 | 地址变换(相对地址→绝对地址)在运行时进行。装入程序在将模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址变换推迟到程序真正要执行时才进行(装入内存后的模块中的地址均是相对地址,模块在内存中可以移动)),需要重定位寄存器的支持实现动态重定位。 |
| | 适用环境 | 多道程序环境 |