搜索
当前位置: 眀彩娱乐 > 动态重定位 >

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

gecimao 发表于 2019-04-30 00:02 | 查看: | 回复:

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

  1、程序编译连接时:符号绑定,各Obj模块的相对虚拟地址空间 --统一的虚拟地址空间;可指定一个BaseAddress以优化装载时的重定位

  2、程序装入内存时: 虚拟地址空间 --虚拟地址空间;如果映像文件中的Base Address 与实际装载的起始虚拟地址空间,不一致,则需要根据偏移量 重定位 重定位项表

  在这之前我一直对地址重定位的细节不是很了解。以下文章摘自《操作系统原理DOS篇(第二版)》。是我目前看过的关于重定位的最好的文章。与大家分享 一下。

  在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块,然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块obj中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做“相对地址空间”或简单地叫做“地址空间”。此即1、程序编译连接时的重定位,也叫符号绑定。

  装配模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与 地址有关的代码,这一过程叫做地址重定位。

  地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。

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

  重定位是由操作系统安排的。在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。

  静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。

  例如,一个以“0”作为参考地址的装配模块(程序可以也可以在编译连接时指定一个Base Address基地址(虚拟地址空间),并完成以此Base Address为参考地址的重定位,这样在装载时,如果实际的装载起始地址(虚拟地址空间)和Base Address相同,就无需再进行转载时的静态重定位),要装入以1000为起始地址的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,MOV EAX,[500]这条指令的意义,是把相对地址为500的存储单元内容1234装入EAX号累器。现在内容为1234的存储单元的实际地址为1500, 即为相对地址(500)加上装入的地址(1000),因此,MOVEAX,[500]这条指令中的直接地址码也要相应地加上起始地址,而成为MOV EAX,[1500]。

  程序中涉及直接地址的每条指令都要进行这样的修改。需要修改的位置称为重定位项,所做的加实际装入模块起始地址修改中的块起始地址称为重定位因子。

  为支持静态重定位,连接程序在生成统一地址空间和装配模块时,应产生一个重定位项表,连接程序此时还不知道装配模块将要装入的实际位置,故重定位表 所给出的需修改位置是相对地址所表示的位置。

  操作系统的装入程序要把装配模块和重定位项表一起装入内存。由装配模块的实际装入起始地址得到重定位因子,然后实施如下两步:

  (2)对实际地址中的内容再做加重定位因子的修改,从而完成指令代码的修改。

  对所有的重定位项实施上述两步操作后,静态重定位才完成,尔后可启动程序执行。使用过的重定位项表内存副本随即被废弃。

  静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域内。

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

  程序的目标模块装入内存时,与地址有关的各项均保持原来的相对地址不进行任何修改。如MOV1,[500]这条指令仍是相对地址500。当此模块被 操作系统调度到处理机上执行时,操作系统将把此模块装入的实际起始起始地址减去目标模块的相对基地址,然后将其差值装入定位寄存器中。当CPU取得一条访 问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址与定位寄存器中的值相加,再依此和值作为内存绝对地址去访问该单元中的数据。

  由此可见,进行动态重定位的时机是在指令执行过程中,每次访问内存前动态地进行。采取动态重定位可带来两个好处:

  (1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;

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

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

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

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

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

  程序和数据装入内存时需对目标程序中的地址进行修改。这种把逻辑地址转变为内存的物理地址的过程叫重定位。对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。1.静态重定位静态重定位是在...博文来自:Clairezz_的博客

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

  一、分别编译与链接(Linking)大多数高级语言都支持分别编译,程序员可以显式地把程序划分为独立的模块或文件,然后每个独立部分分别编译。在编译之后,由链接器把这些独立的片段(称为编译单元)“粘接到一...博文来自:smilesundream的博客

  静态地址重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。优点:无需硬件支持缺点:1...博文来自:wangsifu2009的专栏

  1.逻辑地址空间在多道程序设计中,往往会有多个作业同时存放在内存中,而每个用户预先无法知道他的作业被装在主存的什么位置,为了方便编程,每个用户可以认为自己的程序和数据放在从O地址开始的一组连续...博文来自:xzm_cn

  连续分配方式,是指为一个用户程序分配一个连续的内存空间。-----可重定位分区分配1、动态重定位的引入在连续分配方式中,必须把一个系统或用户程序装入一连续的内存空间。如果在系统中只有若干个小的分区,即...博文来自:斜阳雨陌

  在开发CPU虚拟化时,我们关注的是一种称为有限直接执行(LDE)的通用机制。LDE背后的想法很简单:在大多数情况下,让程序直接运行在硬件上;但是,在某些关键时刻(例如当一个进程发出一个系统调用,或者发...博文来自:binbigdata的博客

  .1存储器的基本概念       主存储器管理仍然是今天操作系统十分重要的内容;能否合理...博文来自:maimang1001的专栏

  连续分配方式,是指为一个用户程序分配一个连续的内存空间。-----可重定位分区分配1、动态重定位的引入在连续分配方式中,必须把一个系统或用户程序装入一连续的内存空间。如果在系统中只有若干个小的分区,即...博文来自:dongyanxia1000的专栏

  从零开始的代码重定位--一个小实例                   ---参考朱有鹏ARM裸机编程1、任务:在SRAM中将代码从0xd0020010重定位到0xd0024000如果创造这个环境?把...博文来自:李辉的博客

  从零开始的UBOOT的学习4--回顾重定位的过程参考朱有鹏ARM裸机课程1、什么是重定位?(1)很多时候我们的启动介质没有那么大的空间进行启动程序,所以为了节约成本,我们会在启动介质使用SRAM或者N...博文来自:李辉的博客

  原文:以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。在用汇编语言或高级语言编写的程序中,是通...博文来自:weixin_33894640的博客

  符号的重定位可执行文件的加载共享库和动态链接博文来自:yongchaocsdn的博客

  一、主存的无力组织和逻辑组织1.绝对地址计算机中,存储器是按字组织,每个字由若干”位“组成(不同计算机子长不同),每个字分配一个地址目前以多字节为单位进行编址系统对存储器中的单元进行统一编号,这些...博文来自:w10800337的专栏

  写在前面这一篇博客与前一篇博客内容连续,这一篇博客主要讨论可重定位分区分配与进程对换的相关知识,也是以理解概念为主要任务。多看几遍,就能搞懂。动态重定位的引入在连续分配方式中,必须把一个系统或用户程序...博文来自:zy2317878的博客

  程序编译知识:程序被编译后的结构模型如下,正文段(.text):由cpu执行的机器指令部分,通常正文段可共享、只读的;初始化数据段(.data):包含程序中需要赋初值得变量;非初始化数据段(.bss)...博文来自:chen1540524015的博客

  0x01引言ELF文件格式,主要基于两种,一种是基于链接视图,链接视图即是基于节(Section)来进行解析,一种是基于执行视图,执行视图即是基于段(Segment)来进行解析。前一种是用于静态分析的...博文来自:随心散人专栏

  Linux动态库原理(二)重定位前面一章《Linux动态库工作原理详解》比较简单浅显的对Linux的工作原理进行了阐述,今天打算从Linux动态库在加载过程中符号的重定位(Relocation)的角度...博文来自:hudaliquan的专栏

  一、必须知道的几个概念。1、链接地址和运行地址。①运行地址,顾名思义就是程序运行的时候的地址,也就是你用工具将代码下载到RAM的那个地址,也叫加载地址。②链接地址,由链接脚本指定的地址。为什么需要链接...博文来自:极客1124的博客

  1.设基址寄存器的内容为1000,在采用动态重定位的系统中,当执行指令“LOADA,2000”时,操作数的实际地址是()。0[参考答案]30002.分页系统的页面是为()...博文来自:小纨绔的博客

  一、重定位  1、静态重定位:静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始      位置,直接修改装配模块的有关使用地址的指令。          2、动态重定位:动态重定...博文来自:雨于鱼的博客

  最近读程序员的自我修养--链接 装载与库,其中有句话:动态链接模块被装载映射到虚拟空间后,指令部分是在多个进程之间共享的,由于装载时重定位的方法需要修改指令,所以没有办法做到同一份指令被多个进程共享,...博文来自:parallelyk的专栏

  原文地址:一、必须知道的几个概念。1、链接地址和运行地址。①运行地址,顾名思义就是程序运行的...博文来自:阁

  重定位病毒自身的重定位是病毒代码在得以顺利运行前应解决的最基本问题。病毒代码在运行时同样也要引用一些数据,比如API函数的名字、杀毒软件的黑名单、系统相关的特殊数据等,由于病毒代码在宿主进程中运行...博文来自:xuplus的专栏

  目录:地址的动静态重定位内存分配算法程序的链接和装入(静态和动态)逻辑地址和物理地址虚拟内存,实际内存,内部外部碎片地址的重定位:程序执行时,必须将地址空间变为绝对地址才能访问系统分配的内存地址重定位...博文来自:k829593756的博客

  若EXE有重定位表,在属性里将重定位已分离勾上,同时将重定位表的数值清零,OK,WIN7再也不用将EXE动态基址了。爽.原文在看雪:标题:【原创】【脱壳修复】win7下简单处理重定位表作者:xhbum...博文来自:pklong008的博客

  一、基本原理前面介绍的各种存储管理中,供用户使用的逻辑地址都是连续的,用户在编制大型程序时就会感到不方便。一个实际的程序往往是由若干段组成的,例如一个主程序段、若干子程序段、若干数据段和工作区段组...博文来自:fryingpan的专栏

  关于ARM中的重定位引入:要想弄明白重定义的问题,首先我们需要引入4个概念: 链接地址/运行地址/位置无关码/位置有关码这里我们先简单回顾一下三星S5PV210芯片的启动过程(如果想详细了解,请翻我之...博文来自:丶一个有梦想的老实人 的博客

  链接和重定位是嵌入式C中很重要的部分,对于这一块掌握的越精细越好。指令位置分类指令分为两种:位置无关编码(PIC):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关位置相关编码:汇编...博文来自:哎呦哥哥的博客

  DLL重定位在32位代码中,涉及到直接寻址的指令都是需要重定位的(而在DOS的16位代码中,只有涉及到段操作的指令才是需要重定位的,对此有兴趣的读者可以参考相关的资料),对于操作系统来说,其任务就是在...博文来自:月下 读书笔记

  在NT环境下隐藏进程,也就是说在用户不知情的条件下,执行自己的代码的方法有很多种,比如说使用注册表插入DLL,使用Windows挂钩等等。其中比较有代表性的是JeffreyRicher在《Window...博文来自:xuplus的专栏

  Uboot重定位是uboot启动后的一个重要功能,重定位的目的是为了让uboot运行在速度性能更好的RAM上,一般是从外部RAM搬移到内部RAM。重定位这块说简单也简单,说复杂也复杂,主要涉及到编译和...博文来自:luciferful的专栏

  将程序(包含可运行的代码和数据)从一个位置(flash)移动至另外一个位置运行或进行数据的读写成为代码重定位。代码重定位的根本原因是改善某个存储介质的某些缺陷(例如存取速度,读写限制等等)。在实际中我...博文来自:Iron_man的博客

  对于一个大的文件,为了便于管理,一个好的办法时把一个大文件分为若干个小文件,每个小文件包含一部分相关的功能,这样功能将显得很整洁,而且移植到其它工程的时候也很方便,把文件copy过去即可。对于汇编,我...博文来自:sxmylittlelee的博客

  请求转发与请求重定位基础请求转发浏览器接收到客户请求后,通知服务器调用另外一个web资源进行处理.称之为请求转发代码说明:1.先要获取context域对象getServletContext()2.从域...博文来自:沙漠皇帝

  从零开始的理解代码重定位--参考朱有鹏ARM裸机编程1、什么是重定位?重定位就是代码搬移到你想要的地址,本来程序是运行在运行地址处的,你可以通过重定位搬移到链接地址处。2、为什么需要重定位?大部分的程...博文来自:李辉的博客

  重定位类型RelocationTypes重定位类型,指示了链接器如何修复链接地址。重定位类型对应的计算方式可以在elf文档中查询到。elf文档常见的重定位类型偏移量的计算R_386_PC32类型,偏移...博文来自:HotIce0

  参考书:《加密与解密》视频:小甲鱼解密系列视频基址重定位链接器生成一个PE文件时,它会假设程序被装入时使用的默认ImageBase基地址(VC默认exe基地址00400000h,dll基地址10000...博文来自:billvsme的专栏

  编译过程和符号表重定位问题:转载至:点击打开链接对于代码的编译问题千头万绪从何说起呢,首先来说一下计算机是如何处理应用程序的,实质上应用程序是通过操作系统来应用机器指令操控硬件设施完成各种任务的,就从...博文来自:Kay的博客

  圣诞献礼!          2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 +  简...博文来自:刘伟技术博客

  使用指南 阅读本指南前,请先阅读快速起步。本文档使用更复杂的场景进一步介绍Sharding-JDBC的分库分表能力。 数据库模式 本文档中提供了两个数据源db0和db1,每个数据源之...博文来自:好读书,每有会意,便欣然忘食。

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重...博文来自:shiter编写程序的艺术

  废话少说直接干货 在虚拟机里安装hadoop,关闭防火墙、配置ip 我的系统环境为:win8系统、vmware11、centos81、设置虚拟机网络通信模式为host only模式 在虚拟机目录...博文来自:梦想的翅膀

  卷积神经网络是深度学习的基础,但是学习CNN却不是那么简单,虽然网络上关于CNN的相关代码很多,比较经典的是tiny_cnn(C++)、DeepLearnToolbox(Matlab)等等,但通过C语...博文来自:tostq的专栏

  单机最大的TCP连接数及其修改 一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535” .    65535这个数字的由来,很多人想当然地将它与port最大值联系起来。的确,TCP的...博文来自:田发江的专栏

  Dll文件调用方式分为显式调用和隐式调用,在这里选择隐式调用的方式。 准备dll文件: 这里选择VS 2010作为dll的开发工具,打开vs 2010,选择文件-新建-项目 在新建项目窗...博文来自:fantasy999999999的专栏

  最近公司安排了个任务:要求交付一个DLL,实现【PDF转换成图片】,最好的效果是能够掌握所有源码,实在不行才交付第三方DLL。研究了6个工作日+1双休+每晚9点下班,逛遍了国内外各种论坛,还是没能成功...博文来自:劼哥舍

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  1、错误:                 键盘遮挡输入框最常见的可能就是在登录界面了,无论有多少个textFiled,不论是在VC的任何位置。都有可能造成键盘弹出来时,把输入框挡住了。...博文来自:AppleWiner的博客

  众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实。而组件签名需要证书,证书从哪里来,你可以选择付1000到3...博文来自:jiangtongcn的专栏

  上一篇博客介绍了如何解决Fragment重叠的问题,有需要的同学可以看一下,底部有demo下载。 直通车:完美解决Fragment重叠本篇博客我们来说一下怎么让fragment重新加载布局资源文件。...博文来自:喻志强的博客

  我们可能经常会用到这一功能,比如有时,我们不希望用户没有进行登录访问后台的操作页面,而且这样的非法访问会让系统极为的不安全,所以我们常常需要进行登录才授权访问其它页面,否则只会出现登录页面,当然我的思...博文来自:沉默的鲨鱼的专栏

  MATLAB编程题 题目描述:从一个NxM的矩阵C中找出与1xM的矩阵P欧氏距离最小的某一行row,要求不能用循环!!! 输入:矩阵C(NxM)、矩阵P(1xM) 输出:row 解题思...博文来自:henryzhihua

  自微软从2013版本推出新的插件注册器后,随着UI的重大更新后,问题也多了很多,前面已有博客提到注册assembly时看不到注册按钮(博文来自:Vic的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  工作需求,渐变色的边框和文字,还需要显示drawable。我们知道如果是View的背景色渐变,那么很好办,只需要写一个drawable文件,里面定义shape然后设置为View的background就...博文来自:泥巴城 的博客

  command窗口是命令窗口,即为sqplus窗口,有命令提示符,识别sqlplus命令,基本的命令都可以执行 sql仅可执行DDL、select、DML等...博文来自:Ape55的博客

  上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别! 四、SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Age...博文来自:假装在纽约

  iOS安全攻防(二十三):Objective-C代码混淆class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄。所以,我们...博文来自:念茜的博客

  测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执...博文来自:路在脚下

  前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件。鉴于使用的是开源库——face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时...博文来自:hongbin_xu的博客

  最近在做一个Mac下的ssh调试工具,但是出现了一点问题。后来发现居然Mac下有串口调试工具可以用,所以果断换串口了,是普通PL2303芯片的usb转串口线。 接下来说下简单的安装步骤吧。我是勤劳的...博文来自:Horizen

本文链接:http://hem-larm.com/dongtaizhongdingwei/311.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部