地址重定位:静态重定位和动态重定位

转载 2016年05月30日 19:26:52

地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程

将逻辑地址空间重定位到物理地址空间的时机有三种:

  1、程序编译连接时。
  2、程序装入内存时。
  3、程序执行时。


以下内容转自:http://bbs.pediy.com/showthread.php?t=76876

  在这之前我一直对地址重定位的细节不是很了解。以下文章摘自《操作系统原理DOS篇(第二版)》。是我目前看过的关于重定位的最好的文章。与大家分享 一下。
  以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。
  在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块,然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把
目标模块obj中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做“相对地址空间”或简单地叫做“地址空间”。
  装配模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与 地址有关的代码,这一过程叫做地址重定位。
  地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。

  地址重定位完成的相对地址转换成内存的绝对地址工作又称为地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。


一、静态重定位
  静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。
  例如,一个以“0”作为参考地址的装配模块,要装入以100为起始地址的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,MOV  EAX,[500]这条指令的意义,是把相对地址为500的存储单元内容1234装入EAX号累器。现在内容为1234的存储单元的实际地址为1500, 即为相对地址(500)加上装入的地址(1000),因此,MOV EAX,[500]这条指令中的直接地址码也要相应地加上起始地址,而成为MOV  EAX,[1500]。
  程序中涉及直接地址的每条指令都要进行这样的修改。需要修改的位置称为重定位项,所做的加实际装入模块起始地址修改中的块起始地址称为重定位因子。
  为支持静态重定位,连接程序在生成统一地址空间和装配模块时, 应产生一个重定位项表,连接程序此时还不知道装配模块将要装入的实际位置,故重定位表 所给出的需修改位置是相对地址所表示的位置。
  操作系统的装入程序要把装配模块和重定位项表一起装入内存。由装配模块的实际装入起始地址得到重定位因子,然后实施如下两步:
  (1)取重定位项,加上重定位因子而得到欲修改位置的实际地址;
  (2)对实际地址中的内容再做加重定位因子的修改,从而完成指令代码的修改。
  对所有的重定位项实施上述两步操作后,静态重定位才完成,尔后可启动程序执行。使用过的重定位项表内存副本随即被废弃。
  静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域内。

二、动态重定位
  动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切地说,是在CPU每次访问内存单元前才进行地址变换。动态重定位可使装配模 块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持。
  程序的目标模块装入内存时,与地址有关的各项均保持原来的相对地址不进行任何修改。如MOV 1,[500]这条指令仍是相对地址500。当此模块被 操作系统调度到处理机上执行时,操作系统将把此模块装入的实际起始起始地址减去目标模块的相对基地址,然后将其差值装入定位寄存器中。当CPU取得一条访 问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址与定位寄存器中的值相加,再依此和值作为内存绝对地址去访问该单元中的数据。
  由此可见,进行动态重定位的时机是在指令执行过程中,每次访问内存前动态地进行。采取动态重定位可带来两个好处:
  (1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;
  (2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

  动态重定位技术所付出的代价是需要硬件支持。


总结:

静态地址重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。

优点:无需硬件支持

缺点:1)程序重定位之后就不能在内存中搬动了;2)要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域中。

 

动态地址重定位:不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切的说,是在每次访问内存单元前才进行地址变换。动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件一定位寄存器的支持。

优点:1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

缺点:需要硬件支持

静态重定位与动态重定位

程序和数据装入内存时需对目标程序中的地址进行修改。这种把逻辑地址转变为内存的物理地址的过程叫重定位。 对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。 1.静态重定位 ...
  • Clairezz_
  • Clairezz_
  • 2015年07月02日 16:49
  • 3798

静态重定位和动态重定位

对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。 静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每...
  • fengzhiyan123
  • fengzhiyan123
  • 2016年08月02日 11:02
  • 4090

地址重定位:静态重定位和动态重定位

地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三种:   1、程序编译连接时。 ...
  • hejingyuan6
  • hejingyuan6
  • 2014年04月19日 17:56
  • 1614

动态重定位执行过程

ld-linux.so.2的_dl_runtime_resolve函数,这个函数解析出puts的绝对地址,回填到GOT[5]。 所有动态库函数在第一次调用时,都是通过XXX@plt -> 公共@...
  • farmwang
  • farmwang
  • 2017年06月21日 23:10
  • 427

关于地址重定位

http://blog.csdn.net/tanliyoung/article/details/1258653 6.1 存储器的基本概念        主存储器管理仍然是今天操作系统十分重要的内容;能...
  • maimang1001
  • maimang1001
  • 2013年12月22日 17:06
  • 1271

重定位----操作系统做的事情

1.逻辑地址空间      在多道程序设计中,往往会有多个作业同时存放在内存中,而每个用户预先无法知道他的作业被装在主存的什么位置,为了方便编程,每个用户可以认为自己的程序和数据放在从O地址开始的...
  • sakawa_x
  • sakawa_x
  • 2013年12月05日 21:39
  • 1922

【转】地址重定位:静态重定位和动态重定位

地址重定位:静态重定位和动态重定位
  • sikinzen
  • sikinzen
  • 2010年06月25日 17:40
  • 5363

操作系统 - 地址重定位

 一、主存的无力组织和逻辑组织 1. 绝对地址 计算机中,存储器是按字组织,每个字由若干”位“组成(不同计算机子长不同),每个字分配一个地址 目前以多字节为单位进行编址 系统对存储器中的...
  • w10800337
  • w10800337
  • 2015年04月13日 09:49
  • 1331

连续分配方式之(可重定位分区分配 )

连续分配方式,是指为一个用户程序分配一个连续的内存空间。 ----- 可重定位分区分配 1、动态重定位的引入 在连续分配方式中,必须把一个系统或用户程序装入一连续的内存空间。如果在系统中只有若干...
  • qq_15037231
  • qq_15037231
  • 2017年02月28日 10:59
  • 823

静态链接、动态链接、静态重定位、动态重定位

一、分别编译与链接(Linking) 大多数高级语言都支持分别编译,程序员可以显式地把程序划分为独立的模块或文件,然后每个独立部分分别编译。在编译之后,由链接器把这些独立的片段(称为编译单元)“粘接...
  • smilesundream
  • smilesundream
  • 2017年07月11日 20:29
  • 199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:地址重定位:静态重定位和动态重定位
举报原因:
原因补充:

(最多只允许输入30个字)