地址重定位-3 2)动态重定位 动态地址映射 动态地址映射是在程序执 动态地址重定位过程 行时由系统硬件完成从逻 辑地址到物理地址的转换 的 重定位寄存器 系统中设置了重定位寄存器 逻辑地址 0100 oo mov r1,(5001 1100 mov rl,(500)) 5012345 150012345 作业地址空间 256K 存储空间 2001年9月20日9时23分 计算机操作系统
2001年9月20日9时23分 计算机操作系统 2)动态重定位 动态地址映射 动态地址映射是在程序执 行时由系统硬件完成从逻 辑地址到物理地址的转换 的。 系统中设置了重定位寄存器。 地址重定位-3
地址重定位-4 动态重定位 动态重定位是指在程序执行过程中进行地址重定位,即在每次 访问内存单元前才进行地址变换。动态重定位可使装配模块不加 任何修改就装入内存,但是它需要硬件一重定位寄存器的支持。 下图给出了动态重定位的示意图。 程序的目标模块在装入内存时,与地址有关的指令都无须进行修 改,如在图中LOAD1,2500这条指令中仍保持相对地址2500。 该模块被操作系统调度到处理机上执行时,操作系统首先把该模 块装入的实际起始地址减去目标模块的相对基地址(图中该模块 的基地址为0),然后将其差值装入重定位寄存器。当CPU取一条 访问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址 与重定位寄存器中的值相加,再根据和值作为内存的绝对地址去 访问该单元的数据
地址重定位-4 动态重定位 动态重定位是指在程序执行过程中进行地址重定位,即在每次 访问内存单元前才进行地址变换。动态重定位可使装配模块不加 任何修改就装入内存,但是它需要硬件—重定位寄存器的支持。 下图给出了动态重定位的示意图。 程序的目标模块在装入内存时,与地址有关的指令都无须进行修 改,如在图中LOAD 1,2500这条指令中仍保持相对地址2500。当 该模块被操作系统调度到处理机上执行时,操作系统首先把该模 块装入的实际起始地址减去目标模块的相对基地址(图中该模块 的基地址为0),然后将其差值装入重定位寄存器。当CPU取一条 访问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址 与重定位寄存器中的值相加,再根据和值作为内存的绝对地址去 访问该单元的数据
动态重定位的示意图 重定位寄存器 dbo 0 10000 100;LOAD1,2500 10100:LOAD1,2500 2500:365 12500:365 260 12600: 程序的地址空间 内存的地址空间
1000 动态重定位的示意图 重定位寄存器 10000 0: 10000: 100:LOAD 1,2500 10100: LOAD 1,2500 + 2500:365 12500:365 2600: 12600: 程序的地址空间 内存的地址空间
地址重定位-5 由此可见,动态重定位是在指令执行过程中动态进行,这样可以带来两个好处 (1)目标程序装入内存时无需任何修改,所以装入之后再移动也不会影响其正确 运行,这便于存储器用紧缩来解决存储器的碎片问题。(2)一个程序由若干个相 对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域 可以不相领接,只要各个模块有自己对应的重定位寄存器就可以了 、动态运行时装入方式 内存较小时,实际运行时换入换出,且使用的内存区域大小也可改变。 不是一次性装入,而是多次装入。 内存 OS 装入模块
地址重定位-5 由此可见,动态重定位是在指令执行过程中动态进行,这样可以带来两个好处: ⑴目标程序装入内存时无需任何修改,所以装入之后再移动也不会影响其正确 运行,这便于存储器用紧缩来解决存储器的碎片问题。⑵一个程序由若干个相 对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域 可以不相领接,只要各个模块有自己对应的重定位寄存器就可以了。 三、动态运行时装入方式 内存较小时,实际运行时换入换出,且使用的内存区域大小也可改变。 不是一次性装入,而是多次装入。 装入模块 内存 OS 用户区
522程序的链接 用户程序的上机过程 1)编译用户源代码一>几个目标模块/程序 2)链接由链接程序把目标模块+它们所需库函数一>可装入模块。 3)执行由装入程序把装入模块一>内存一>执行。 静态链接:一次性地把若干目标模块链接成一个装入模块,以后不再拆开 P136图5-4。 需解决的问题 1、对相对地址的修改。 编译把用户源代码—>几个目标模块,其起始地址都为0,每个模块中的地址 都是相对于这个0地址的。 2、变换外部调用符号 把每个模块中的外部调用符号→相对地址 装入时动态链接:边装入内存边链接。在装入一个目标模块时,若发生一个外 部模块调用,将引起装入程序去找出相应的外部模块,并将它装入内存;同时 也要修改目标模块中的相对地址 优点:1、可单独修改各个目标模块,易修改,而静态链接不可能修改 2、装入时动态链接易于实现共享。而静态链接必须COPY
5.2.2 程序的链接 用户程序的上机过程: 1)编译 用户源代码—>几个目标模块/程序。 2)链接 由链接程序把目标模块+它们所需库函数—>可装入模块。 3)执行 由装入程序把装入模块—>内存—> 执行。 一、静态链接:一次性地把若干目标模块链接成一个装入模块,以后不再拆开。 P136图5-4。 需解决的问题: 1、对相对地址的修改。 编译把用户源代码—>几个目标模块,其起始地址都为0,每个模块中的地址 都是相对于这个0地址的。 2、变换外部调用符号。 把每个模块中的外部调用符号→相对地址。 二、装入时动态链接:边装入内存边链接。在装入一个目标模块时,若发生一个外 部模块调用,将引起装入程序去找出相应的外部模块,并将它装入内存;同时 也要修改目标模块中的相对地址。 优点:1、可单独修改各个目标模块,易修改,而静态链接不可能修改。 2、装入时动态链接易于实现共享。而静态链接必须COPY