精华内容
下载资源
问答
  • 地址重定位:静态重定位和动态重定位

    万次阅读 多人点赞 2014-09-19 09:33:13
    地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三种:  1、程序编译连接时。  2、程序装入内存...

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

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

      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)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

    缺点:需要硬件支持。

    
    展开全文
  • 静态重定位和动态重定位

    万次阅读 多人点赞 2018-06-04 18:50:31
    区别这两个概念之前,要知道 重定位 的概念。重定位,通常来说把在装入时对目标程序中指令数据地址修改的过程称为重定位。而静态重定位就是,在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成...

    区别这两个概念之前,要知道 重定位 的概念。

    重定位,通常来说把在装入时对目标程序中指令和数据地址修改的过程称为重定位。

    静态重定位就是,在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成的,以后不再改变。

    优点是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。 

    缺点:内存空间不能移动;各个用户进程很难共享内存中同一程序的副本

    动态重定位:动态运行的装入程序把转入模块装入内存之后,并不立即把装入模块的逻辑地址进行转换,而是把这

    种地址转换推迟到程序执行时才进行,装入内存后的所有地址都仍是逻辑地址。这种方式需要寄存器的支持,其中

    放有当前正在执行的程序在内存空间中的起始地址。

    优点:内存空间可以移动;各个用户进程可以共享内存中同一程序的副本。

    缺点增加了机器成本,而且实现存储管理的软件算法比较复杂。 

    展开全文
  • 重定位和动态链接 符号解析:得到E、D两个集合 重定位: 合并相同的节:把E中所有相同的节合并成新节 对D中定义符号确定位置:确定虚拟空间地址 对引用符号重定位:修改.text.data节对符号的引用(地址) 重定位...

    重定位和动态链接

    1. 符号解析:得到E、D两个集合
    2. 重定位:
      1. 合并相同的节:把E中所有相同的节合并成新节
      2. 对D中定义符号确定位置:确定虚拟空间地址
      3. 对引用符号重定位:修改.text和.data节对符号的引用(地址)
    3. 重定位条目:记录在.reltext 和 .reldata节
      重定位目标文件中对需要符号引用的描述(节中偏移,引用符号,重定位方式)
      1. PC相对地址:由偏移量和PC(由重定位前的值算出)确定虚内存地址
      2. 绝对地址方式:直接填引用符号的地址
    4. 可执行文件的加载:0x08048000开始加载入虚拟内存
      execve():系统调用加载可执行文件
    5. 动态链接:

      1. 静态库.a的缺点:
        1. 主存浪费:每个进程(虚存)执行库函数时都要载入主存(物理)
        2. 磁盘浪费:每个可执行文件链接时都要包含.o
        3. 库的更新影响程序,要及时编译出新的版本
      2. 共享库:.so/.dll(包含大量.o文件)
        1. 特点:主存和磁盘中均只有一份
        2. 装入或运行时:动态加载与链接

        gcc -shared -fPIC -o mylib.so myproc1.o myproc2.o
      3. 加载时过程:运行前
        1. 静态链接器链接库的重定位和符号表—>部分可执行文件(磁盘中)
        2. 部分可执行文件调用加载器—->启动动态链接器
        3. 动态链接器链接代码和数据—>完全的可执行文件(存储器中)

      4. 运行时过程:运行过程中调用动态链接器接口

    6. 动态库的位置无关代码(PIC):
      4种跳转方式

    展开全文
  • 地址重定位:静态重定位和动态重定位

    转自:http://bbs.pediy.com/showthread.php?t=76876
      在这之前我一直对地址重定位的细节不是很了解。以下文章摘自《操作系统原理DOS篇(第二版)》。是我目前看过的关于重定位的最好的文章。与大家分享 一下。
      以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。
      在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做“名字空间”。汇编语言源程序经过汇编,或者 高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块,然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存 中执行。我们把目标模块中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做“相对地址空间”或简单地叫做“地址空间”。
      装配模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与 地址有关的代码,这一过程叫做地址重定位。
      地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。
      地址重定位完成的相对地址转换成内存的绝对地址工作又称为地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。
    一、静态重定位
      静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。
      例如,一个以“0”作为参考地址的装配模块,要装入以100为起始地址的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,MOV  EAX,[500]这条指令的意义,是把相对地址为500的存储单元内容1234装入EAX号累器。现在内容为1234的存储单元的实际地址为1500, 即为相对地址(500)加上装入的地址(1000),因此,MOV EAX,[500]这条指令中的直接地址码也要相应地加上起始地址,而成为MOV  EAX,[1500]。
      程序中涉及直接地址的每条指令都要进行这样的修改。需要修改的位置称为重定位项,所做的加实际装入模块起始地址修改中的块起始地址称为重定位因子。
      为支持静态重定位,连接程序在生成统一地址空间和装配模块时, 应产生一个重定位项表,连接程序此时还不知道装配模块将要装入的实际位置,故重定位表 所给出的需修改位置是相对地址所表示的位置。
      操作系统的装入程序要把装配模块和重定位项表一起装入内存。由装配模块的实际装入起始地址得到重定位因子,然后实施如下两步:
      (1)、取重定位项,加上重定位因子而得到欲修改位置的实际地址;
      (2)、对实际地址中的内容再做加重定位因子的修改,从而完成指令代码的修改。
      对所有的重定位项实施上述两步操作后,静态重定位才完成,尔后可启动程序执行。使用过的重定位项表内存副本随即被废弃。
      静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在 若干个不连续的区域内。

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

    展开全文
  • 对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个...
  • 静态重定位动态重定位

    千次阅读 2015-07-02 16:49:26
    对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。 1.静态重定位 静态重定位是在目标程序装入内存时,由装入程序对目标程序中的指令数据的地址进行修改,即把程序的逻辑地址都改成...
  • 重定位概念:程序在装入内存时将逻辑地址转换为物理地址。 重定位分类— 静态重定位:在程序装入内存时就将逻辑地址转换为物理地址 优势:操作简单,不需要额外的机构...动态重定位:在程序运行期间,需要某一内...
  • 重定位动态链接

    2017-10-28 17:58:47
    符号的重定位 可执行文件的加载 共享库和动态链接
  • 动态重定位执行过程

    千次阅读 2017-06-21 23:10:01
    ld-linux.so.2的_dl_runtime_resolve函数,这个函数解析出puts的绝对地址,回填到GOT[5]。 所有动态库函数在第一次调用时,都是通过XXX@plt...linux 动态链接器提供动态重位功能,所有外部函数只有调用时才做重定位
  • pltgot引入延迟重定位机制之后,方案复杂度就更高了。为了让大家对延迟机制有深入的理解,将Linux方案写成C语言伪代码。
  • 12. 重定位动态链接

    2018-12-07 17:28:34
    12.1 符号的重定位 1. 重定位步骤 2. 重定位信息 3. 重定位操作举例 (1)源文件 (2)链接结果 (3)R_386_PC32的重定位 main.o重定位前 R_386_PC32的重定位方式 (4) R_386_32的重定位 重定位前 R_386_...
  • 重定位和链接

    千次阅读 2016-07-10 11:32:44
    链接和重定位是嵌入式C中很重要的部分,对于这一块掌握的越精细越好。 指令位置分类 指令分为两种: 位置无关编码(PIC):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关 位置相关编码:...
  • 编译过程符号表重定位问题:转载至:点击打开链接 对于代码的编译问题千头万绪从何说起呢,首先来说一下计算机是如何处理应用程序的,实质上应用程序是通过操作系统来应用机器指令操控硬件设施完成各种任务的,...
  • 链接重定位指静态链接时的重定位;
  • 装入程序按照装入模块中的地址,将程序数据装入内存。绝对装入只适用于单道程序环境。 静态重定向:装入模块中的地址还是逻辑地址,直到真正装入时将逻辑地址变换位物理地址,程序运行期间无法移动 动态重定向:...
  • 程序编译知识: 程序被编译后的结构模型如下,正文段(.text):由cpu执行的机器指令部分,通常正文段可共享、只读的;初始化数据段(.data):包含程序中需要赋初值得变量;...程序装入和重定位
  • 05 重定位和链接脚本

    2017-02-05 21:48:17
    重定位
  • ARM之重定位和链接脚本

    千次阅读 2018-05-14 16:52:42
     2、动态重定位动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位。更确 切地说,是在每次访问内存单元前才进行地址变换。动态重定位可是装配模块不加任何修改而装入内 存...
  • 用Table4Table 5程序例子中的可重定位目标文件可执行目标文件来说明链接器聚合了可重定位目标文件中相同的节(先用readelf将各目标文件读出来,再查看.symtab,从符号表可得每个符号所在的节。) (2) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 179,107
精华内容 71,642
关键字:

动态重定位和动态链接的区别