起因:关于下面两图的理解


1.共享代码的浮动(相对寻址方式)
概念与机制:共享代码的"浮动"是指程序代码采用相对寻址 后,可以在主存中任意位置装入 而不影响执行正确性。这种寻址方式由程序计数器(PC)的内容加上指令中给定的偏移量来形成有效地址,即 EA = (PC) + A。由于操作数或跳转目标的地址用相对距离 表示而非固定绝对地址,代码中的指令地址随PC变化自动调整,两者始终相差一个固定偏移。这样一来,程序整体搬移到内存其他区域时,指令中的相对地址无需修改,依然指向正确的目标位置,从而保障程序在不同内存位置运行的正确性。这种利用相对寻址实现的代码位置无关性就是程序"浮动",意味着程序可以在内存的不同位置上运行 而无需更改代码。相对寻址特别广泛用于转移控制指令(如跳转、分支),利用偏移计算实现程序的跳转执行。例如,一条在地址0x100处的指令JMP 0x110,若采用相对寻址,其指令中实际存储的是偏移量+0x10。当整个程序从地址0x100搬移到0x200执行时,该跳转指令仍按偏移+0x10进行跳转:从PC=0x200跳到0x210,正好对应新位置中目标指令的地址0x210,从而实现正确跳转。由此可见,相对寻址使得程序代码的存放位置改变后,指令依然能依据固定偏移访问正确的地址,实现代码的自由浮动。
共享代码副本的实现:由于相对寻址使代码中不含绝对物理地址,多个进程可以共享同一份程序代码副本 而无需分别维护各自的代码拷贝。这通常要求代码段是纯代码(不自我修改),使用相对地址访问,使其成为地址无关代码(PIC) 。操作系统可以将同一个只读代码段映射到多个进程的地址空间中(可能映射到不同地址),每个进程运行时通过自身的PC处理相对地址,但底层实际指向的是同一段物理内存中的代码hansimov.gitbook.io。由于代码中的地址计算基于相对偏移,每个进程不管代码段被加载到哪里,指令作用的目标地址始终按偏移量在该进程的地址空间内找到,从而各进程共享一份代码 仍能独立正确执行。这种机制节省了内存(只需存储一份代码)、简化了程序部署,并保证了程序在不同环境中运行时不因内存地址变化而出错。相对地址带来的好处是程序设计者不必关心代码放在主存的具体绝对地址,只需确保各指令/数据间的相对位置正确即可。相对寻址不需要额外的重定位寄存器支持,也不需在运行时调整任何地址参数,因此实现程序浮动更加简洁高效。正因如此,在支持多道程序并发的系统中,相对寻址被视为实现程序浮动的关键技术之一。
2.编制浮动程序(基址寻址方式)
概念与机制: "编制浮动程序"是指利用基址寻址 方式来编写可搬移的程序,使程序的逻辑地址在装入时能够灵活映射到不同物理地址。基址寻址是由基址寄存器 (BR)存放一个基准地址,加上指令中给出的形式地址偏移A来形成实际访问的地址,即 EA = (BR) + A。这里的基址寄存器通常由操作系统在装入程序时设置为该程序被加载到主存的起始物理地址 blog.csdn.net。程序员在编写和编译程序时,可以将所有代码和数据地址视作从逻辑地址0开始的偏移(即逻辑地址 或形式地址)。当操作系统将程序调入内存时,例如决定将程序放置在物理地址P处,就把BR设置为P;此后程序执行过程中BR的内容保持不变,所有指令中的地址偏移A在CPU取址时会与BR相加,从而转换为实际的物理地址 blog.csdn.net。由于基址寄存器由操作系统管理,用户程序在运行期间无法修改其值 blog.csdn.net,所以程序中的地址引用自动相对于新的基址进行计算。通过这种方式,程序的逻辑地址空间 可在加载时平移 到任何物理内存位置------操作系统只需改变基址寄存器的初始值(即程序的起始地址),而无需重写或重新编译程序代码 ,程序即可在新地址正常运行blog.csdn.net。换言之,基址寻址让地址转换在程序装入时由硬件完成:逻辑地址 + 基址 = 物理地址,实现了程序的搬移(浮动)而不改变指令本身。操作系统利用这一机制可以灵活地在内存中安置程序,并且在需要时(如内存紧张或内存整理)把程序移动到别的内存区域,只要相应更新BR,程序仍能继续正确执行。
举例说明:假设程序在编译时采用基址寻址,所有内存引用都以偏移形式给出。例如一条指令:MOV AX, [0x0020],表示从逻辑地址0x0020处取数据(偏移A=0x20)。当操作系统将该程序装入主存时,若选择将程序放到物理地址0x3000处运行,则设置BR = 0x3000。此时执行这条指令时,有效地址EA = (BR) + 0x0020 = 0x3020 ,即从物理地址0x3020读取数据。如果下次程序被装入物理地址0x5000处,只需将BR改为0x5000,而代码中这条指令仍是MOV AX, [0x0020]不变,CPU计算出的EA将变为0x5020,自动访问新的位置的数据。可见,基址寻址通过基址寄存器的重定位,使程序起始位置改变时无需修改指令地址码 ,实现了装入时重定位 (装入加载时由OS分配实际基址)。在程序执行过程中,BR一般保持不变(除非进行再次重定位或使用多段基址等机制),所有内存访问都统一加上这个基址,实现了整个程序在内存中的整体搬移blog.csdn.net。这种方法特别适合操作系统进行内存管理:用户编程时不必考虑自己的程序将放在主存的哪个区域 ,由操作系统根据内存分配情况赋予BR一个起始基地址即可;程序被移动后也丝毫不影响其执行blog.csdn.net。因此,基址寻址方式极大地方便了操作系统装入程序时改变起始地址而不必重写代码,提高了程序的可重定位性。需要注意的是,基址寻址依赖于硬件提供额外的基址寄存器支持内存地址转换,并要求程序中使用的都是相对地址(偏移量)而不出现绝对地址,这样才能保证通过改变BR实现所有地址的平移。
3.两种浮动机制的比较
-
相对寻址(共享代码浮动) :由CPU自动将PC和偏移相加定位地址,无需专门的重定位寄存器 ,也不需要在执行过程中修改任何寄存器或地址值blog.csdn.net。编译出的代码本身就是位置无关的,因而更简洁高效地支持程序浮动,适合代码在不同内存位置运行甚至被多个进程共享hansimov.gitbook.io。相对寻址尤其用于指令跳转等场景,使代码模块能够独立于装载地址执行。其缺点是在某些架构下偏移量位数有限,会限制可寻址范围blog.csdn.net。总体而言,在多道程序环境下,相对寻址由于不依赖额外硬件且开销低,被认为是实现程序浮动的重要手段 blog.csdn.net。
-
基址寻址(编制浮动程序) :利用硬件寄存器实现地址重定位,由操作系统设置基址寄存器BR 完成逻辑地址到物理地址的转换blog.csdn.net。它允许程序在装入时被放到任意内存区域,起始物理地址通过BR灵活调整,实现程序整体搬移而无需修改代码 blog.csdn.net。基址寻址扩大了地址空间的利用范围(偏移量位数较小但通过增加BR高位可以定位更大内存)blog.csdn.net。其不足之处在于需要占用一个寄存器 来存储基址,在寄存器资源有限时不是最优选择,而且如果程序需要访问不同内存段,可能需要频繁更新BR ,增加了实现复杂性和运行开销blog.csdn.net。尽管如此,基址寻址在操作系统中的应用极为重要,它提供了程序装入时重定位的机制,使多个程序可以并发存在于不同内存区域而互不干扰blog.csdn.net。综合来看,相对寻址偏重于编译时/运行时的代码自适应 (无需重定位寄存器,代码自身独立于位置),而基址寻址偏重于操作系统支持的装入重定位(通过硬件寄存器实现地址映射)。两种方式各有应用场景,在408考研计算机组成原理要求下都属于重要的程序浮动实现手段,理解它们有助于灵活设计可重定位的程序代码。