程序装入和链接
程序在经过编译成目标模块(.obj)文件,链接程序链接之后,需要将对应的模块装入内存,有三种方式:
(1)绝对装入,绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际地址完全相同,不需要对程序和数据的地址进行修改。
——只适用于单道程序环境(也就是说,基本上接触不到了)
(2)可重定位装入,在多道程序环境中,多个目标模块的起始地址通常都是从0开始的,装入时对目标程序中的指令和数据的修改过程称为重定位。地址变换通常是在装入时一次完成的,又称为静态重定位。最大特点是一个作业装入内存时必须分配其要求的全部内存空间,如果没有足够内存,就无法装入。作业一旦进入内存,整个运行期间不能在内存中移动,也不能再申请内存空间(C语言的malloc和C++的new怎么办。。。)
(3)动态运行时装入,即动态重定位,需要一个重定位寄存器的支持。最大特点就是可以将程序分配到不连续的存储区中。运行之前装入部分代码即可运行,运行期间可以根据需要动态申请内存,可以用用户提供一个比存储空间大的多的地址空间。
逻辑地址与物理地址的关系:
编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址(或逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。