程序的装入和连接
用户程序要在系统运行,必须要先将他装入内存,将其转变为一个可执行程序。通常经过一下步骤:
1.编译,由编译程序对用户源程序进行编译,然后形成若干个目标模块。
2.连接,由连接程序将一系列目标模块和它们需要的库函数进行连接,形成一个完整的装入模块
3.装入,由装入程序将装入模块装入内存。
程序的装入
为了方便阐述,先介绍一个无需连接的目标模块直接装入,此时的目标模块就是装入模块。
绝对装入模式
当计算机很小时,且只能运行单个程序,此时完全有可能知道程序将装载到内存的什么未知。此时可以采用觉得装入方式,经过编译后,将产生的绝对地址的目标代码,之后便可以直接运行。
可重载定位装入模式
在单处理器多程序情况下,编译程序不可能直到经过编译后的目标模块应该放在内存的何处。因此,对于编译产生的逻辑地址将会加上程序的起始地址的到真正的物理地址。同时这种重载定位的操作将在装入目标程序时完成,以后不再改变,也成这种模式为静态重定位。
动态运行时的装载方式
这种方式与静态重定位的不同之处在于静态重定位是在装入内存时完成重载操作,而动态重定位是在指令真正执行时才进行重载操作,也就是说在内存中的地址依旧是逻辑地址,并不是真正的物理地址,同时为了不影响指令的执行速度,需要额外的重定位寄存器的支持。
程序的连接
静态连接方式
在程序运行之前,将目标模块和它们所需要的库函数连接形成完整的装配模块,以后不再拆开。
装入时动态连接
在程序编译后得到的一组目标模块装入内存时,采用边装入边连接的方式。
即在装入目标模块时,若发生一个外部模块调用事件,就去寻找响应的目标模块装入内存。
运行时动态连接
在程序执行过程中,若发现一个被调用的模块尚未调入内存,则立刻去找到该模块调入内存,并执行。