源程序经过编译、链接后形成可装入模块,将它装入内存后就可以投入运行。由于程序的逻辑地址空间和内存的物理地址空间并不一致,因此装入程序在将程序(可装入模块)装入内存后,在程序执行之前还必须将程序代码中的逻辑地址转换为真实的物理地址,即进行地址转换。
1.程序装入
程序装入是指装入程序根据内存当前的实际使用情况,将程序(可装入模块)装入到内存合适的物理位置。装入操作针对的是程序(可装入模块)的整个逻辑地址空间,而对应的物理地址空间既可以是连续的,也可以是离散的。程序装入内存后并不能立即运行,因为程序中凡涉及访问内存地址(简称访存地址)的指令其访存地址仍然是逻辑地址,而不是内存中的实际物理地址,因此无法实现直接访问。要使装入内存的程序能够运行,就必须将程序中出现的逻辑地址都转换为计算机能够直接寻址的内存物理地址。这种地址转换操作称为地址映射、地址转换或地址重定位。
根据装入时间的不同,可以将程序装入分为运行前静态装入和运行时动态装入两种。静态装入指在运行之前,一次性地将全部程序(所有可装入模块)装入内存,并且在程序装入内存时或在程序运行前,一次性完成程序中所有的逻辑地址到物理地址的转换工作;运行时动态装入是指将程序的各目标模块按运行的需要,逐次调入内存并链接到调用模块上。由于是逐次装入内存,因此不可能一次性完成将程序中所有逻辑地址转换为物理地址的工作,这个地址转换工作只能推迟到程序执行中进行,即执行到涉及访存地址的指令时再进行地址转换。
2.静态重定位
静态重定位(静态地址转换)是指装入程序将全部程序(所有可装入模块)装入内存适当的位置后,在该程序装入内存时或运行之前,一次性地将程序中凡涉及访存地址的指令,其访存地址按下面的公式全部由相对地址(逻辑地址)转换为绝对地址(物理地址),并在程序运行过程中不再改变。
若采用静态重定位,通常不允许在程序静态重定位后,重新移动该程序代码和数据在内存的存放位置,因为这种移动意味着刚才对程序进行的重定位必须推倒重来,即需按程序新的内存起始地址对程序再次进行静态重定位,这无疑会耗费大量的CPU时间。静态重定位的地址转换示例如图6-2所示。
图6-2 静态重定位示意图
在图6-2中,逻辑地址空间的用户程序在地址200号单元中有一条取数指令“MOV AX,[500]”,该指令的功能是将地址500号单元中存放的整数12345取到寄存器AX中。由于程序被装入到起始地址为5000的内存区域,因此如果不把相对地址500转换为绝对地址(内存物理地址),而是从内存500号单元地址中取数就会出错。正确做法是将取数指令中数据的相对地址500加上本程序存放在内存中的起始地址5000,将相对地址500转变成绝对地址(物理地址)5500,即取数指令“MOV AX,[500]”应修改为“MOV AX,[5500]”。因此程序在装入内存后应将其所有的相对地址都转换为绝对地址(逻辑地址都转换为物理地址)。
采用静态重定位的优点是简单、容易实现,不需要增加任何硬件设备,可以通过软件全部实现。但缺点也很明显,主要表现在以下三个方面。
(1)程序装入内存后,在运行期间不允许该程序代码和数据在内存中移动,即无法实现内存重新分配,因此内存的利用率不高。
(2)如果内存提供的物理存储空间无法满足当前程序代码和数据的存储容量,则必须由用户在程序设计时,采用某种方法来解决存储空间不足的问题,这无疑增加了用户的负担。
(3)不利于用户共享存放在内存中的同一个程序。如果几个用户要使用同一个程序,就必须在各自的内存空间中存放该程序的副本,这无疑浪费了内存资源。
3.动态重定位(www.xing528.com)
动态重定位(动态地址转换)是指无论将程序一次性装入内存,还是在程序运行中动态装入各目标模块(或虚拟存储器中动态装入程序的分页和分段)到内存,都不立即进行逻辑地址到物理地址的转换,地址的转换工作是在程序执行中进行的,即当执行的指令涉及访存地址(此时为逻辑地址)时再进行地址转换。这样,那些虽然涉及访存地址但却没有执行的指令,或者没有调入内存执行的目标模块都不进行地址转换,这无疑减少了地址转换的工作量。
为了提高地址转换的速度,动态重定位要依靠硬件地址转换机构来完成。硬件地址转换(重定位)机构需要一个(或多个)基地址寄存器(简称基址寄存器或BR,又称重定位寄存器)和一个(或多个)程序逻辑地址寄存器(VR)。指令或数据在内存中的绝对地址与逻辑地址的关系为
其中,(BR)与(VR)分别表示基址寄存器和程序逻辑地址寄存器中的内容。
动态重定位的过程:装入程序将程序(可装入模块)装入内存,然后将程序所装入的内存区域首地址作为基地址送入BR中。在程序运行过程中,当某条指令访问到一个相对地址(逻辑地址)时,则将该相对地址送入VR中。这时,硬件地址转换机构把BR和VR中的内容相加就形成了要访问的绝对地址(内存物理地址),如图6-3所示。
图6-3 动态重定位示意图
在图6-3中,逻辑地址空间的用户程序在地址200号单元中有一条取数指令“MOV AX,[500]”,该指令的功能是将地址500号单元中存放的整数12345取到寄存器AX中。程序装入内存后,它在内存中的起始地址5000被送入BR中,当执行到“MOV AX,[500]”指令时,则将相对地址500送入VR中,这时硬件地址转换机构将两个寄存器BR和VR的内容相加得到该指令要访问的物理地址5500,从而将内存物理地址5500中的数据12345取到AX中。
动态重定位具有以下三个优点。
(1)指令和数据的物理地址是在程序运行过程中由硬件动态形成的。只要将进程的各程序段在内存区中的起始地址存放到基址寄存器BR中,就能由地址转换机构得到正确的物理地址。因此可以给同一进程的不同程序段分配不连续的内存区域,并且在程序装入内存后,也可再次移动该程序代码和数据在内存中的存放位置,只要将移动后该程序代码和数据在内存的起始地址放入基址寄存器BR即可正常运行,这有利于内存的管理和内存利用率的提高。
(2)动态重定位的地址转换工作是在程序执行过程中,所执行的指令涉及访存地址时才进行地址转换,因此在程序运行时没有必要将它的所有模块都装入内存,可以在程序运行期间通过请求调入方式来装入所需要的模块,不需要的模块则不装入内存,按照这种方式使用内存就可以使有限的内存运行更大或更多的程序。因此,动态重定位构成了虚拟存储器的基础。
(3)动态重定位有利于程序段的共享。多个进程可以共享位于内存区中的同一程序段,只要将该程序段在内存的起始地址放入基址寄存器:BR即可。
动态重定位的缺点主要表现在两个方面:一方面是需要硬件支持,另一方面是实现存储管理的软件算法比较复杂。
注意:静态重定位仅适用全部程序一次性装入内存的情况,且地址变换是在程序装入内存时或程序运行前一次性完成;动态重定位既适用全部程序一次性装入内存的情况,又适用于在程序运行中动态装入各目标模块到内存的情况,无论采用哪种装入方式,动态重定位的地址变换都是在程序运行过程中执行到涉及访存地址的指令时进行。所以一次性将全部程序装入内存的方式,可以采用静态重定位或动态重定位方式进行地址变换,但运行时动态装入程序的各目标模块到内存的方式,以及虚拟存储器中动态装入分页和分段到内存的方式,只能采用动态重定位方式进行地址变换。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。