程序的重定位问题(程序装入)

在多道程序环境下,要使程序运行,必须先为程序创建进程。而创建进程的第一件事就是:将程序和数据装入内存。如何将一个用户源程序变成可在内存中执行的程序,通常都要进过几个步骤:1.编译:由compiler将源程序编译成若干个目标模块(Object Module);2.链接:由Linker将编译后形成的一组目标模块以及他们所需要的库函数连接在一起,形成一个完整的装入模块(Load Module);3;装入:由Loader将装入模块装入内存。


程序的装入方式一本可分为以下3种:


1.绝对装入方式(Abosolute Loading Mode)

       在编译时,如果程序知道将驻留在内存的什么位置,那么,编译程序将产生绝对地址的目标代码。绝对装入方式按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址和实际内存地址完全相同,所以不需要对程序和数据的地址进行修改。


2.可重定位装入方式(Relocation Loading Mode)

       绝对装入方式能将目标模块装入到内存中事先指定的位置。在多道程序环境下,编译程序不可能预知所编译的模块应该放在内存的何处,因此,绝对装入方式只适用于单道程序环境。在多道程序环境下,所得到的目标模块起始地址通常从0开始,程序中的其他地址都是相对于起始地址0计算的,此时应该采用可重定位装入方式,根据内存当时的情况,将装入模块装入到内存的合适位置。

       值得注意的是:在采用重定位装入方式将程序装入内存后,会使装入模块中的所有逻辑地址和内存的物理地址不同,解决方法是:在装入的时候,将装入模块中指令和数据的逻辑地址修改为物理地址,这一过程就叫重定位。又因为地址变换是在装入时一次性完成的,以后不会再改变,所以称为静态重定位


3.动态运行时装入方式(Dynamic Run-time Loading)

        静态重定位方式可将装入模块装入到内存中任何允许的位置,所以可以用于多道程序环境;但是这种装入方式并不允许程序运行时在内存中移动位置因为程序一旦移动的话,就必须修改程序和数据的绝对地址。然而,实际情况是,程序在运行的过程中在内存的位置可能经常要改变,此时就应该采用动态重定位的方式。
        动态重定位的装入程序在把模块装入内存后,并不会立即把模块中的相对地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址仍然是相对地址,为了使地址转换不影响指令的执行速度,这种方式需要一个重定位寄存器来存储模块在内存中的起始地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab频响优化,MATLAB中关于频响图函数最优化的程序问题

我是一名大四的学生,现在正在做毕业设计,因MATLAB从未学过,也是边学边做,我需要求出IGv函数的频率响应图,因IGv的表达式很复杂,这里我没列出,在下面的程序中有的,以下是我的程序,请高手帮我看看程序有什么问题哈,万分感谢!%%igmax is global maximumIgmin1000000000;%%exmperim…

杂项-事务:OLTP(联机事务处理过程)

ylbtech-杂项-事务:OLTP(联机事务处理过程)On-Line Transaction Processing联机事务处理过程(OLTP)也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理…

dvd管理器java,简单DVD管理-java练习题

问题描述为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理。管理器具备的功能主要有:1、查看DVD信息。菜单选择查看功能,展示DVD的信息。2、新增DVD信息选择新增功能,根据提示输入新增的DVD名称,添加到…

从hello world 说程序运行机制

开篇 学习任何一门编程语言,都会从hello world 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的hello world。 然而,对于hello world 这个简单程序的内部运行机制,我相信还有很多人都不是很清楚。hello wor…

webapp支持什么数据库_数据库和Webapp安全

webapp支持什么数据库威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和webapp安全的问题。 该页面变得笨拙,并且使读者无法轻松地与我或其他人进行交互。 威胁模型 所有安全分析必须从检查威胁模型开始。 威胁模型要求您回答四个问题: 我要…

开发进度3

对于将软件变为小程序上,还是无法成功,需要继续寻找相关资源学习 转载于:https://www.cnblogs.com/NCLONG/p/10419840.html

matlab排序函数 下标,MATLAB排序函数 - 小众知识

>> Amagic(3)A 8 1 63 5 74 9 2>> sort(A)ans 3 1 24 5 68 9 7>> sort(A,1)ans 3 1 24 5 68 9 7>> sort(A,2)ans 1 6 83 5 72 4 9Matlab中给一维向量排序是使用sort函数:sort(A),排序是按升序进行的,其中A为待排序的…

可执行程序加载到内存的过程

在linux中,程序的加载,涉及到两个工具,linker 和loader。Linker主要涉及动态链接库的使用,loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式,它为程序运行划分了两个段&…

使用Apache Storm和Apache Ignite进行复杂的事件处理(CEP)

在本文中, “使用Apache Ignite进行高性能内存计算”一书的作者将讨论使用Apache Strom和Apache Ignite进行复杂的事件处理。 本文的一部分摘自 书 。 术语“复杂事件处理”或CEP没有广泛或高度接受的定义。 Wikipedia的以下引用可以简要描述什么是复杂事件处理&a…

【BZOJ5213】[ZJOI2018]迷宫(神仙题)

【BZOJ5213】[ZJOI2018]迷宫(神仙题) 题面 BZOJ洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案。 构建\(K\)个点分别表示\(mod\ K\)的余数。那么点\(i\)的出边\(j\)指向\(i*mj\ mod\ K\)。容易证明这样子一定是可行的。 但是我们显然还有一部分点是…

php 合并两个数组并去重,合并两个数组 以KEY 作为键

$a array(array(ID> 2));$b array(array(ID> 5656));print_r($r);//合并两个数组 以ID值 作为键function mergeById(&$arr1,&$arr2, $keyID){$arr array();foreach($arr1 as $v) {$arr[$v[$key]] $v;}foreach($arr2 as $v){$arr[$v[$key]] isset($arr[$v[$key…

进程的创建与可执行程序的加载

一、进程试探 编程实现一个简单的shell程序 点击(此处)折叠或打开 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #include<sys/types.h> #define NUM 1024 int mystrtok(char *argv[], char* string) {/…

chrome面板介绍

Chrome开发者工具详解(1)&#xff1a;Elements、Console、Sources面板 Chrome 开发者工具详解(2)&#xff1a;Network 面板 Chrome开发者工具详解(3)&#xff1a;Timeline面板 Chrome 开发者工具详解(4)&#xff1a;Profiles 面板 Chrome开发者工具详解 (5)&#xff1a;Applica…

菜鸟php ajax,AJAX ASP/PHP

AJAX ASP/PHP 实例AJAX 用于创造动态性更强的应用程序。AJAX ASP/PHP 实例下面的例子将为您演示当用户在输入框中键入字符时&#xff0c;网页如何与 web 服务器进行通信&#xff1a; 请在下面的输入框中键入字母(A - Z)&#xff1a;实例Start typing a name in the input field…

没有系列化导致错误:java.io.NotSerializableException: com.bjpowernode.bean.Team

java.io.NotSerializableException: com.bjpowernode.bean.Team Cause: java.io.NotSerializableException: com.bjpowernode.bean.Player 有一个没有实现接口的转载于:https://www.cnblogs.com/Koma-vv/p/10367855.html

CPU-bound(计算密集型) 和I/O bound(I/O密集型)

I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多&#xff0c;此时&#xff0c;系统运作&#xff0c;大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写&#xff0c;此时 CPU Loading 不高。 CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多&#x…

stringutils_番石榴分配器vs StringUtils

stringutils因此&#xff0c;我最近写了一篇关于旧的&#xff0c;可靠的Apache Commons StringUtils的文章 &#xff0c;该文章引起了很多评论&#xff0c;其中之一是Google Guava提供了更好的连接和拆分字符串的机制。 我必须承认&#xff0c;这是我尚未探索的番石榴的一个角落…

workerman php访问,workerman 配置域名访问 (本地)

我确定我在我的liunx 终端 运行了 php start.php start 我为workerman在本地指定了一个域名 打开域名提示 Usage: php yourfile.php {start|stop|restart|reload|status} 请问是什么情况 清楚吗&#xff1f;配置如下server {listen 80; #监听端口&#xff0c;前面可加IPserver_…

使用Spring Integration Java DSL与Rabbit MQ集成

我最近参加了在拉斯维加斯举行的2016年Spring会议 &#xff0c;很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人&#xff0c;他们实际上合并了几年前我与Spring Integration相关的一些小贡献– Gary Russel和Artem Bilan &#xff0c;他们启发了我重…

深度学习工程搭建

一个完整的深度学习工程项目包含数据标注&#xff0c;数据训练&#xff0c;数据预测三部分&#xff0c;逻辑结构图和技术架构如下所示&#xff1a; 这里分别从这3个方面进行展开&#xff1a; 1.数据标注&#xff1a;包含原始数据的处理和标注&#xff0c;输出为训练预测可用的网…