程序的装入是由装入程序将程序从外存装入内存,等待运行。程序的装入分为绝对装入方式、可重定位装入方式和动态运行时装入方式。
1.绝对装入方式
绝对装入方式根据程序在内存中将要驻留的起始地址,选择该地址作为目标模块的链接起始地址,产生与驻留内存物理地址一致的装入模块,即程序逻辑地址与内存物理地址完全相同。程序每次装入内存,需要装入内存固定位置,运行时不再需要对逻辑地址进行转换。绝对地址装入方式对程序员有较高的要求,需要程序员熟悉计算机内存的使用情况。若将图3-3链接生成的程序装入到内存起始地址为0×30008000的一片连续内存空间,则在链接目标模块时起始地址即参考0×30008000,程序中转移指令、数据传送指令中的地址也参考于此起始地址,程序在外存和内存中的视图如图3-4(a)所示。
2.可重定位装入方式
绝对装入方式必须将程序装入内存固定位置,因此,绝对装入方式只适用于单任务操作系统。而在多任务系统环境,程序链接时均参考统一的逻辑起始地址,例如0×0。若链接产生的装入模块不加修正,随机装入内存指定位置,则会发生程序逻辑地址与内存物理地址不一致问题,例如,图3-3链接生成的程序不加修正装入内存起始地址为0×30008000的一片连续内存空间,“jump 0×20”指令会跳转到程序所占内存空间以外的地址,导致程序执行异常。可重定位装入方式就是在装入程序时,根据操作系统为其分配的内存空间起始地址,将程序指令中的逻辑地址转换为与之对应的内存物理地址,图3-3链接生成的程序装入到内存起始地址为0×30008000的一片连续内存空间后,“jump 0×20”指令会被修正为“jump 0×30008020”,如图3-4(a)所示。通常把装入程序时对程序指令中的地址修正过程称为重定位。又因为可重定位装入方式是在程序装入时一次完成,以后不再改变,故又称为静态重定位。
图3-4 模块装入示意图(www.xing528.com)
3.动态运行时装入方式
可重定位装入方式可以将程序装入内存的任何位置,但不允许在内存中移动位置。因为,程序若在内存中移动,意味着程序在内存的起始物理地址发生了改动,必须再次修正程序指令中的逻辑地址。然而,多任务环境往往出于某种原因需要程序在内存中移动位置,此时就应该采用动态运行时装入方式。
动态运行时装入方式在把装入模块装入内存时,并不立即把装入模块中的逻辑地址转换为绝对地址,而是把这种地址转换推迟到程序真正运行时才进行。图3-3链接生成的程序采用动态运行时装入方式装入内存后,指令中的逻辑地址不做修正,如图3-4(b)所示。
采用动态运行时装入方式,程序运行时逻辑地址到内存物理地址的转换靠硬件地址转换机构来实现,硬件系统中通常是设置一个重定位寄存器,加载操作系统为程序分配的内存空间起始物理地址。程序在执行时,真正访问的内存物理地址是程序逻辑地址与重定位寄存器相加的和,如图3-5所示。由于地址变换是在程序执行期间,随着对每条指令或数据的访问自动进行,故称为动态重定位。程序若要在内存中移动,程序本身并不需要做任何改动,仅需要修改重定位寄存器中的内容即可。
图3-5 动态重定位
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。