DJ4-2 程序的装入和链接

news2024/11/27 21:05:35

目录

4.2.1  程序的装入

一、绝对装入方式

二 、可重定位装入方式

三、动态运行时装入方式

4.2.2  程序的链接

一、静态链接

二、装入时动态链接

三、运行时动态链接


在多道程序环境下,如果程序要运行,那么必须为之创建进程。而创建进程的第一件事就是要把用户编写好的源程序和数据装入内存。如何将一个用户的源程序变成一个可在内存中执行的程序,通常要经过下列几步:

1、编译

源程序是用高级语言或汇编语言编写的一组程序语句。计算机不能直接执行源程序,它需要被编译程序或解释程序翻译成机器级代码,即目标模块。

2、链接

目标模块是纯二进制的机器级代码。虽然计算机可以执行目标级代码,但是典型的目标模块是不完备的,它还需要包含对其它目标模块或库函数的引用。因此,目标模块通常是不能被装入计算机并执行的,需要首先被链接成一个装入模块。

装入模块是能被装入并执行的完备的机器级代码。这个将目标模块链接成装入模块的过程,是由链接程序(Linker)实现的。

3、装入

装入是指由装入程序将装入模块装入内存并执行。

4.2.1  程序的装入

根据存储空间的分配方式,将一个装入模块装入内存时,可采用三种方式:

一、绝对装入方式

装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存地址完全相同,因此不需要对程序和数据的地址进行修改。

通常在程序中采用符号地址,然后在编译或汇编时,再将这些符号地址转换为绝对地址。

二 、可重定位装入方式

  • 目标模块中的地址为相对地址,即地址都是相对于0开始的。
  • 装入模块中的逻辑地址与实际装入内存的物理地址不同。

重定位:在装入内存时,对相对地址做出相应的修改以得到正确的物理地址。

相对地址是指数据地址和指令地址。

根据地址变换进行的时间及采用技术手段不同,分为:

  • 静态重定位
  • 动态重定位

静态重定位

  • 地址变换是在装入内存时一次性完成的,并且以后不能移动
  • 物理地址 = 相对地址 + 内存中的起始地址

适用于多道程序环境,可以将装入模块装入到内存中任何允许的位置

  • 优点:不需要硬件地址变换机构支持,可以装入有限多道程序
  • 缺点:一个程序通常占用连续的内存空间,装入内存后不能移动,不易实现共享

三、动态运行时装入方式

装入程序将装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序执行时进行。

动态重定位:在硬件地址变换机构的支持下,随着对每条指令或数据的访问自动进行地址变换。

重定位寄存器 RR:将相对地址与 RR 中的内容相加后得到的地址作为访问主存的地址。

采用动态重定位技术后,程序中所有指令和数据的实际地址是在运行过程中最后访问的时刻确定的。

主要优点:

  • 对主存的使用更加灵活有效
  • 几个作业共享一程序段的单个副本比较容易
  • 有可能向用户提供一个比主存的存储空间大得多的地址空间

主要缺点:

  • 需要附加硬件地址变换机构
  • 实现存储器管理的软件比较复杂

4.2.2  程序的链接

链接程序的功能:将编译后得到的一组目标模块以及它们所需要的库函数,装配成一个完整的装入模块。根据链接时间的不同,可把链接分成三种:

一、静态链接

在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装入模块,以后不再拆开。装入模块又称为执行模块,或称为可执行文件。

应该是在装入内存之前完成链接的。

说明:将几个目标模块链接成一个装入模块时,需要解决以下两个问题:

1、对相对地址进行转换:将除第一个模块外的模块的相对地址转换为装入模块中相对地址。

2、对外部调用符号进行转换:将每个模块中所用的外部调用符号,都转换为相对地址。

例如将 call B 变换为 JSR “L”

二、装入时动态链接

用户源程序经编译后所得到的目标模块,是在装入内存时,边装入边链接的。即在装入一个目标模块时,若发生一个外部模块调用,将引起装入程序去找出相应的外部目标模块,并将其装入内存。

优点:

1、便于软件版本的修改和更新。对于经静态链接装配在一起的装入模块,如果要修改或更新其中的某个目标模块,则要求重新打开装入模块。这不仅是低效的,而且有时是不可能的。若采用动态链接方式,由于各目标模块是分开存放的,所以要修改或更新各目标模块是件非常容易得事。

2、便于实现目标模块共享。即可以将一个目标模块链接到几个应用模块中,从而实现多个应用程序对该模块的共享。

三、运行时动态链接

将对某些目标模块的链接推迟到程序执行时才进行,即在执行过程中,若发现一个被调用模块尚未装入内存时,立即由 OS 去找到该模块,将它装入内存,并链接到调用模块上。

优点:执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上,不仅可加快程序的装入过程,而且可节省大量的内存空间。

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

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

相关文章

六级备考8天|CET-6|阅读强化2|19:30~21:00

目录 正确选项两大标准 练习 问题一 问题二 问题三 问题四​ 问题五 ​ 正确选项两大标准 1. 定位准确 2. 改写正确 举例: 练习 问题一 immediate vicinity oftoo close unprecedented 前所未有的; 问题二 主语:a global campaign 谓…

解决问题 Could not obtain transaction-synchronized Session for current thread

一、问题现象 在使用Hibernate的项目中,在一个定时任务中,执行某段代码,满足条件后,更新表数据。 程序在执行到更新表数据的时候,报错如下: Could not obtain transaction-synchronized Session for cur…

chatgpt赋能python:用Python优化微信群SEO

用Python优化微信群SEO 随着微信群的普及,越来越多的人开始将其作为社交媒体和个人品牌的重要推广渠道之一。然而,想要让你的微信群在搜索引擎中排名靠前,就需要进行一些有效的SEO技巧,以吸引更多的目标用户。 在本文中&#xf…

黏糊糊的菜单

先看效果&#xff1a; 再看代码&#xff1a; <!--黏糊糊的菜单 可融合--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【pytorch】维度变换

【pytorch】维度变换 View操作unSqueeze操作图片处理的一个案例squeeze 维度删减操作维度扩展-expand维度扩展-repeat矩阵的转置操作-transpose View操作 将一个四维的张量&#xff08;b x c x h x w&#xff09;转换成一个二维的张量 对于四张图片 将每一张图像用一行向量进…

阿里内部秀出新天际的SpringBoot实战笔记,让开发像搭积木一样简单

​什么是 Spring Boot Java (面向对象编程语言)经过 30 多年的发展&#xff0c;产生了非常多的优秀框架。Spring (为解决企业应用程序开发的复杂性而创建的框架)曾是最受欢迎的 Java 框架之一&#xff0c; 但随着 Node、Ruby、Groovy、PHP 等脚本语言的蓬勃发展&#xff0c;使…

行业热点 | Quest 3发布、苹果MR发布在即, 6月初XR大戏即将上演

编者按&#xff1a; 昨夜&#xff0c;朋友圈被Quest3占领&#xff0c;Meta首款消费级MR头显Quest 3在其一年一度的游戏展示会前正式发布&#xff0c;扎克伯格亲自站台&#xff0c;这也侧面透露确实将还有几天就要发布的苹果MR头显视为强有力的竞争对手。 另一边&#xff0c;W…

Linux系统的开机自启脚本方法

centOS中 方法1&#xff1a;/etc/rc.local /etc/rc.local是rc.d/rc.local的软链 1、在自己需要启动的文件目录中编写一个shell脚本文件auto_run_script.sh&#xff08;文件名称你们随意&#xff09;。我的这个timeTest文件是timeTest.cpp编译过来的。主要是过几秒打印一下时…

Dubbo中的常用组件

微服务的架构主要包括服务描述、服务发现、服务调用、服务监控、服务追踪以及服务治理这几个基本组件。 那么每个基本组件从架构和代码设计上该如何实现&#xff1f;组件之间又是如何串联来实现一个完整的微服务架构呢&#xff1f;今天我就以开源微服务框架Dubbo为例来给你具体…

机器学习实战六步法之训练模型、优化模型、部署模型(七)

要落地一个机器学习的项目&#xff0c;是有章可循的&#xff0c;通过这六个步骤&#xff0c;小白也能搞定机器学习。 看我闪电六连鞭&#xff01;&#x1f923; 训练模型 当确定好机器学习算法之后&#xff0c;就可以通过训练数据集中的特征和标签&#xff0c;根据样本数据的…

SLAM中刚体的运动描述

简介 物体在真实世界中是运动的&#xff0c;SLAM中求解的机器人位姿就是求解机器人的运动。SLAM的问题就是求解世界坐标系中的静态物理点坐标以及运动的机器人点坐标集合&#xff08;机器人运动点的集合构成机器人的运动轨迹&#xff09;。而通常我们获取的信息是以机器人本体为…

测试真的会被ChatGPT代替一文告诉你

送走最后一车货&#xff0c;最后三个工人&#xff0c;老王吃力的关上大铁门。左手从口袋摸出一盒烟&#xff0c;轻轻一颠&#xff0c;滑落一根&#xff0c;右手娴熟的夹住。掏出打火机&#xff0c;点燃&#xff0c;一丝青烟腾起&#xff0c;萦绕在指头。 夕阳穿过玻璃&#xf…

知道这些英文文档翻译的方式吗

在工作中&#xff0c;大家有没有遇到领导交给你一份外语的文档&#xff0c;要你去观看和理解&#xff0c;但是我们看不太懂或者没啥时间去一点点翻译怎么办呢&#xff1f;我们就需要有工具来将文档翻译&#xff0c;它是一项非常实用和便捷的功能&#xff0c;它可以将文档中的文…

高级运维工程师的工作职责描述(合集)

高级运维工程师的工作职责描述1 职责&#xff1a; 1、参与设计、审核的Linux系统以及各应用系统的体系架构; 2、全面负责公司运维项目的系统升级、linux系统运营维护&#xff0c;保障公司服务器零风险; 3、负责阿里云服务器监控,搭建cacti、zabbix、nagios等监控产品&#xff0…

STM32信号量

目录 什么是信号量&#xff1f; 什么是二值信号量&#xff1f; 二值信号量相关 API 函数 1. 创建二值信号量 2. 释放二值信号量 3. 获取二值信号量 实操 实验需求 cubeMX配置​编辑 代码实现 计数型信号量 什么是计数型信号量&#xff1f; 计数型信号量相关 API 函…

CENTO OS上的网络安全工具(二十三)VSCODE SPARK 容器式编程环境构建

在vscode上使用maven构建spark的scala编程环境&#xff0c;很大程度上需要不断地从网络上下载各种依赖和插件&#xff0c;而且这一过程复杂而不可控。下面这段&#xff0c;是整个安装过程中/root目录下不断增加的内容。 [rootd7ff8f448a0d /]# cd /root [rootd7ff8f448a0d ~]#…

【 Python 全栈开发 - WEB开发篇 - 32 】MySQL高级查询

文章目录 一、LIMIT限制查询结果的数量二、使用GROUP BY进行分组查询1.GROUP BY和聚合函数一起使用2.GROUP BY和聚合函数以及HAVING一起使用 三、使用ORDER BY对查询结果排序 一、LIMIT限制查询结果的数量 开始之前&#xff0c;我们先准备一下数据&#xff0c;打开cmd&#xf…

MsSqlServer2008R2移动数据库迁移复制粘贴附加.mdf不要.ldf日志 230609记录

MsSqlServer2008R2数据库迁移复制粘贴附加.mdf 230609记录 将一个SqlServer的某个数据文件.mdf拷贝到另一个数据库当中,并启用 操作工具为 SSMS(SQL Server Management Studio) 19.1 免费下载 SQL Server Management Studio (SSMS) 19.1 .mdf文件 SQL Server 数据库中的三…

【数据结构】何为数据结构。

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星T…

chatgpt赋能python:Python循环暂停和继续的方法

Python循环暂停和继续的方法 Python是一种高级编程语言&#xff0c;在编程中使用循环结构非常常见。很多情况下&#xff0c;我们需要在循环中暂停或者继续执行。在本文中&#xff0c;我们将介绍如何在Python中实现循环暂停和继续的方法。 循环暂停和继续的意义 在Python编程…