1、绝对装入

如果知道程序将会放在内存的具体位置,就在编译的时候生成程序的物理地址。之后装入程序就会按照装入模块里面已经生成的物理地址放进内存进行运行。

只适用于单道程序的运行环境(单道批那时候没有操作系统,所以就是编译程序来干转换地址的事情)

2、可重定位装入(静态重定位)

在多道程序的运行环境下,我们并不能预知当程序并发执行的时候会放在内存的哪个地方。

多个目标模块的起始地址通常都从0开始,其他的地址则是相对于0的相对地址。

在装入的时候对程序里面的一些指令和数据进行修改的过程叫做重定位,地址变换也在装入的时候一次完成,把逻辑地址转换成对应内存的物理地址。在装入的时候转换了以后就不会再进行修改,所以也叫静态重定位

3、动态重定位(动态运行时装入)

顾名思义,动态运行时装入,也就是说,在要执行的时候,才把这一部分的目标模块进行地址转换。(此时已经在内存中等待运行了)所以在等待运行的时候,地址都是相对地址。

这种方式需要重定位寄存器的支持,重定位寄存器存放的是装入模块在内存中的起始位置,根据这个起始位置来确定指令,执行指令。

特点:

可以把程序放在不连续的存储区中,在程序运行之前装入他的部分代码就可以运行,然后再程序运行的时候根据需要动态申请内存。

写这个主要原因是我开始不能理解“装入程序把装入模块装入内存,……,又要动态申请内存…”

……

在链接以后会通过装入程序形成一个完整的装入模块,这个装入模块包含着“目标模块和对应需要的库函数”,装入模块装进内存以后就可以等待运行,等到真正要运行的时候就会把这个装入模块的逻辑地址转换成物理地址,然后还会通过重定位寄存器来记录装入模块刚装进内存的起始地址,便于执行指令。

程序通常是存放在外存里面,要运行的时候,操作系统会申请分配内存空间,才放进内存里面,进行运行。也就是说一个程序刚开始的时候是放在外存里面的,只装入部分的代码(投入部分代码进内存)就可以运行了,然后要运行其他代码的时候就接着装入,接着申请内存,接着把这个起始位置放进重定位寄存器里面