程序的装入和链接
基本的加载一个程序到执行的过程入如下所示:
编译:由编译程序对用户源程序进行编译,形成若干目标模块;
链接:由链接程序将编译后形成的一组目标模块以及其所需要的库函数链接在一起,形成一个完整的装入模块;
装入:由装入程序(Loader)将装入模块装入内存。
程序的装入有三种方式:
1)绝对装入方式:用户程序经过编译之后,将产生绝对地址(物理地址)的代码,即按照装入模块中的地址,将程序和数据装入内存,将目标模块装入到内存中事先指定的位置中。
这样的好处是:由于程序的相对地址(逻辑地址)和实际内存中地址完全相同,不需要对程序和数据地址进行修改。
这样的局限性:程序中使用的绝对地址可以在编译或者汇编时给出,或者程序员直接赋予,但是由于程序直接给出绝对地址,要求程序员熟悉内存的使用情况,而且程序或者数据被修改后,可能要改变程序中的某些地址。
解决办法:可在程序中使用符号地址,然后在编译或者汇编时使用符号地址装换为绝对地址。
使用的场景:计算机系统小,仅能运行单道程序,完全可能知道程序在内训的什么位置时,可使用绝对装入方式。
2)可重定位装入方式:
根据内存的具体情况将装入模块装入到内存的适当位置,装入内存之后,会使装入模块中的所有逻辑地址与实际的装入内存的物理地址不相符,在装入时,对目标程序中指令金额数据地址进行修改(重定位)。
应用场景:针对多道程序环境下,编译程序不可能预知编译后所得的目标模块应该存放在内存的何处。
3)动态运行时装入:该方式允许在程序运行时装入到内存中移动的位置,装入程序在把装入模块装入内存之后,并不立即把装入模块中的逻辑地址转为物理地址,而是把地址转换推迟到程序真正要运行时才进行,为了 使转换地址不影响指令的执行速度,这种方式需要一个重定位寄存器的支持。
应用场景:在对换功能的系统中,一个进程可能被多次换出,又被多次换入,每次换之后的位置都是不同的,应采用这种装入模式。