如何将一个用户源程序变为一个可在内存中执行的程序?

本文参考存储器的层次结构、程序的装入和链接

1.三个步骤:

(1)编译(Compiler):将用户源代码编译成若干个目标模块(Objetc Module)
(2)链接(Linker):将目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)
(3)装入(Loader):将装入模块装入内存

=============================================================================

2.装入方式:

1)绝对装入方式:

在编译时,如果能够事先知道程序将驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。

绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存中的地址完全相同,故不需对程序和数据的地址进行修改。

该装入方式只适用于单道程序环境

绝对地址既可在编译时给出,也可由程序员直接赋予。

要求程序员熟悉内存的使用情况。一旦程序或数据被修改后,可能要改变程序中的所有地址。

2)可重定位装入方式:

在多道程序环境下,所得到的目标模块的起始地址通常是从0开始的,程序中的其他地址也都是相对于起始地址计算的。采用此方法将装入模块装入内存后,会使装入模块的所有逻辑地址与实际装入内存的物理地址不同。通常是把在装入时对目标程序中指令和数据的修改称为重定位。又因为地址变换通常是在装入时由软件一次完成的,以后不再改变,所以称为静态重定位。

缺点:不允许在运行时变换地址

3)动态运行时装入方式:

程序在内存中移动,意味着要改变物理位置,这时必须对程序和数据的地址(绝对地址)改变才能运行。然而实际情况经常要改变,所以用动态运行时装入方式。动态运行时装入方式在将装入模块装入内存后,并不立马把装入模块中的相对地址转换为绝对地址,而是把这种转换推迟到程序真正要执行时才进行。因此装入内存的都是相对地址。为使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。

=============================================================================

3.链接方式:静态链接、装入时动态链接、运行时动态链接

如何将一个用户源程序变为一个可在内存中执行的程序?_第1张图片
如何将一个用户源程序变为一个可在内存中执行的程序?_第2张图片

你可能感兴趣的:(操作系统)