2。地址重定位 地址重定位完成把相对地址转换成内存中的绝对地址,这 个过程称为地址映射(map)。按照重定位的时机,可分 为静态重定位和动态重定位。 静态重定位 静态重定位是在程序执行之前进行重定位。它根据装配模 块将要装入的内存起始地址,直接修改装配模块中的有 关使用地址的指令。 在图中以“0”作为参考地址的装配模块,要装入以 1000为起始地址的存储空间。显然在装入程序之前,程 序必须做一些修改才能正确运行
2。地址重定位 地址重定位完成把相对地址转换成内存中的绝对地址,这 个过程称为地址映射(map)。按照重定位的时机,可分 为静态重定位和动态重定位。 静态重定位 静态重定位是在程序执行之前进行重定位。它根据装配模 块将要装入的内存起始地址,直接修改装配模块中的有 关使用地址的指令。 在图中以“0”作为参考地址的装配模块,要装入以 1000为起始地址的存储空间。显然在装入程序之前,程 序必须做一些修改才能正确运行
地址重定位2 10000: 100: LOAD1,2500 10100:LOAD1,12500 2500 365 12500: 365 2600: 12600: 程序的地址空间 内存的地址空间 例如:LOAD1,2500这条指令是把相对地址为2500的存储单元 的内容365装入1号累加器。而这时内容为365的存储单元的实 际物理地址为12500(起始地址10000+相对地址2500),所以 LOAD1,2500这条指令中的直接地址码要作相应的修改,即 改为LOAD1,12500
地址重定位-2 10000: 10100: 12500: 12600: 程序的地址空间 内存的地址空间 例如:LOAD 1,2500 这条指令是把相对地址为2500的存储单元 的内容365装入1号累加器。而这时内容为365的存储单元的实 际物理地址为12500(起始地址10000+相对地址2500),所以 LOAD 1,2500 这条指令中的直接地址码要作相应的修改,即 改为LOAD 1,12500。 LOAD 1,2500 LOAD 1,12500 365 365 0: 100: 2500: 2600:
地址重定位-3 在程序中需要修改的位置称为重定位项。程序装入内存中的起 始地址称为重定位因子。为了支持静态重定位,连接程序在生成统 地址空间和装配模块时,还应产生一个重定位项表。所以操作系 统的装入程序要把装入模块和重定位项表一起装入内存。由装配模 块的实际装入起始地址得到重定位因子,然后取重定位项,加上重 定位因子得到欲修改位置的实际地址,最后对实际地址中的内容再 加上重定位因子,从而完成指令代码的修改。当完成重定位后,就 可以启动程序执行 静态重定位虽然有无须硬件支持的优点,但是也存在明显的缺 点:一是程序重定位以后就不能在内存中移动;二是要求程序的存 储空间是连续的,不能把程序存储到若干个不连续的区域中
地址重定位-3 在程序中需要修改的位置称为重定位项。程序装入内存中的起 始地址称为重定位因子。为了支持静态重定位,连接程序在生成统 一地址空间和装配模块时,还应产生一个重定位项表。所以操作系 统的装入程序要把装入模块和重定位项表一起装入内存。由装配模 块的实际装入起始地址得到重定位因子,然后取重定位项,加上重 定位因子得到欲修改位置的实际地址,最后对实际地址中的内容再 加上重定位因子,从而完成指令代码的修改。当完成重定位后,就 可以启动程序执行。 静态重定位虽然有无须硬件支持的优点,但是也存在明显的缺 点:一是程序重定位以后就不能在内存中移动;二是要求程序的存 储空间是连续的,不能把程序存储到若干个不连续的区域中
地址重定位-4 动态重定位 动态重定位是指在程序执行过程中进行地址重定位, 即在每次访问内存单元前才进行地址变换。动态重定位 可使装配模块不加任何修改就装入内存,但是它需要硬 件一重定位寄存器的支持。下图给出了动态重定位的示 意图。 程序的目标模块在装入内存时,与地址有关的指令都无 须进行修改,如在图中LOAD1,2500这条指令中仍保 持相对地址2500。当该模块被操作系统调度到处理机上 执行时,操作系统首先把该模块装入的实际起始地址减 去目标模块的相对基地址(图中该模块的基地址为0) 然后将其差值装入重定位寄存器
地址重定位-4 动态重定位 动态重定位是指在程序执行过程中进行地址重定位, 即在每次访问内存单元前才进行地址变换。动态重定位 可使装配模块不加任何修改就装入内存,但是它需要硬 件—重定位寄存器的支持。下图给出了动态重定位的示 意图。 程序的目标模块在装入内存时,与地址有关的指令都无 须进行修改,如在图中LOAD 1,2500这条指令中仍保 持相对地址2500。当该模块被操作系统调度到处理机上 执行时,操作系统首先把该模块装入的实际起始地址减 去目标模块的相对基地址(图中该模块的基地址为0), 然后将其差值装入重定位寄存器
动态重定位的示意图 重定位寄存器 10000: 100;IOAD1,2500 10100:LOAD1,2500 2500:365 12500:365 2600 12600: 程序的地址空间 内存的地址空间
1000 动态重定位的示意图 重定位寄存器 10000 0: 10000: 100:LOAD 1,2500 10100: LOAD 1,2500 + 2500:365 12500:365 2600: 12600: 程序的地址空间 内存的地址空间