程序的装入过程可以总结为以下三种方式及其格式:
绝对装入方式
格式:用户程序经过编译后,产生的是绝对地址(物理地址)的代码。程序和数据按照装入模块中的地址装入内存,目标模块被装入到内存中事先指定的位置。
优点:由于程序的相对地址(逻辑地址)和实际内存中地址完全相同,不需要对程序和数据地址进行修改。
适用场景:编译时已知程序将驻留在内存的特定位置。
静态链接和静态装入
格式:在编译阶段,所有的目标文件被链接成一个可执行映象。这个可执行映象包含了所有必要的模块,并且每个模块都以一种可重定位的格式存放在磁盘上。
过程:首先,主程序被装入内存并开始运行。当程序需要调用另一个模块中的函数时,会检查该模块是否已装入内存。如果尚未装入,链接装入器会将该模块装入内存,并更新程序的地址表以反映这一变化。然后,控制转移到新装入的模块中被调用的函数。
适用场景:适用于需要将多个模块合并成一个可执行文件的情况。
动态链接和动态装入
格式:与静态链接类似,所有目标文件在编译时被链接成一个可执行映象,但每个模块在装入时动态地确定其在内存中的位置。
过程:在程序运行时,动态链接器负责将所需的模块动态地装入内存,并更新地址表。这种方式允许程序在运行时加载和卸载模块,具有更大的灵活性。
适用场景:适用于需要运行时加载模块或共享库的情况。
这些格式的选择取决于程序的需求和运行环境。绝对装入适用于已知内存布局的情况,静态链接和动态链接适用于模块化和动态加载的需求。