操作系统(10)----从写程序到程序运行

目录

一.从写程序到程序运行

二.链接

三.如何将逻辑地址转为物理地址

1.绝对装入

2.可重定位装入(静态重定位)

3.动态运行时装入(动态重定位)


一.从写程序到程序运行

程序员通过编辑器编辑源代码文件,通过编译后会生成与源代码文件对应的目标模块文件,并且这些模块中包含若干指令,这些指令中包含逻辑地址。

编译:

由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)

接下来就是链接,即把目标模块组合起来形成相应的装入模块,其含有完整的逻辑地址,即可执行模块。

链接:

由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块

 接下来将模块装入内存中,并且将其逻辑地址转换为物理地址。

装入(装载):

由装入程序将装入模块装入内存运行。

二.链接

上面提到过,链接就是由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块,现在讲一下链接的几种方式。

1.静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。

在形成装入模块后,就形成了装入模块的完整的逻辑地址。

2.装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。

使用这一方法,目标模块的完整逻辑地址是一边装入一边形成的。

3.运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。如下图,若程序不需要使用b()函数,就不将其对应的目标模块装入即可。其优点是便于修改和更新,便于实现对目标模块的共享。

三.如何将逻辑地址转为物理地址

上面提到装入时需要将逻辑地址转换为物理地址,现在来讨论一下装入的方法。

1.绝对装入

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。(也就是将编译程序中各变量的地址修改为正确的绝对地址)

例如:如果直到装入模块要从地址为100的地方开始存放

装入内存,从100开始装入:

缺点:灵活性很差,只适用于单道程序环境。

2.可重定位装入(静态重定位)

静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。

与绝对装入的区别在于,静态重定位是在程序装入内存时,再进行地址转换,将逻辑地址转为物理地址。

静态重定位的特点:

•在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。

•作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

•一般用于早期的多道批处理操作系统。

3.动态运行时装入(动态重定位)

动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。

重定位寄存器:

存放了装入模块存放的起始位置,例如下图,起始位置为100。

当CPU访问指令0时,会将其中的逻辑地址79,与重定位寄存器的起始位置相加,得到其访问的地址。

与静态重定位的区别在于,动态重定位装入时依旧保持使用逻辑地址。

动态重定位的特点:

•采用动态重定位时允许程序在内存中发生移动。

•可将程序分配到不连续的存储区中;

•在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;

•便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

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

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

相关文章

前端常见标签

<li> (List Item)&#xff1a;定义列表中的一个项目&#xff08;项&#xff09; <ul> (Unordered List)&#xff1a;定义无序列表 <ol> (Ordered List)&#xff1a;定义有序列表 <a> (Anchor Tag)&#xff1a;定义超链接 <ul><li>苹…

Datax问题记录

1、同步mysql&#xff1a;OS errno 24 - Too many open files 2023-11-20 12:30:04.371 [job-0] ERROR JobContainer - Exception when job run com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的…

Vue 上门取件时间组件

本文使用vue2.0elementui 制作一个上门取件时间组件&#xff0c;类似顺丰&#xff0c;样式如下&#xff1a; 大概功能&#xff1a;点击期望上门时间&#xff0c;下面出现一个弹框可以选择时间&#xff1a; 首先我们定义一些需要的数据&#xff1a; data() {return {isDropdown…

P1967 [NOIP2013 提高组] 货车运输

[NOIP2013 提高组] 货车运输 题目背景 NOIP2013 提高组 D1T3 题目描述 A 国有 n n n 座城市&#xff0c;编号从 1 1 1 到 n n n&#xff0c;城市之间有 m m m 条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。 现在有 q q q 辆货车在运输货物&#x…

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言&#xff0c;只删除数据不删除表的结构&#xff0c;会走事务&#xff0c;执行时会触发trigger&#xff08; 触发器…

Nicn的刷题日常之打印菱形

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 用C语言在屏幕上输出以下图案&#xff1a; 2.解题思路 仔细观察图形&#xff0c;可以发现&#xff0c;此图形中是由空格和*按照不同个数的输出组成的。 上三角&#xff1a;先输出空格&#xff0c;后输出*&#xff0c;每…

jvm基础篇之垃圾回收[3](垃圾回收器)

文章目录 分代GC代取划分原因垃圾回收器组合关系年轻代-Serial垃圾回收器老年代-SerialOld垃圾回收器年轻代-ParNew垃圾回收器老年代-CMS垃圾回收器年轻代-Parallel Scavenge垃圾回收器老年代-Parallel Old垃圾回收器 G1垃圾回收器G1内存结构G1回收方式年轻代回收混合回收FULL …

搭建k8s集群实战(四)k8s node 资源管理、避免系统无响应

Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。 除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题,从而导致系统无响…

OpenCV+ moviepy + tkinter 视频车道线智能识别项目源码

项目完整源代码&#xff0c;使用 OpenCV 的Hough 直线检测算法&#xff0c;提取出道路车道线并绘制出来。通过tkinter 提供GUI界面展示效果。 1、导入相关模块 import matplotlib.pyplot as plt import numpy as np import cv2 import os import matplotlib.image as mpimg …

React18构建Vite+Electron项目以及打包

一.先创建项目 cnpm create vite 选择React > JavaScript >cd react_vite > cnpm i >npm run dev 二.安装Electron依赖 指定版本相对稳定 cnpm i electron19.0.10 -D cnpm i vite-plugin-electron0.9.3 -D cnpm i electron-builder23.0.1 -D三.创建electron目录…

Vue中的计算属性和侦听器(监视器)

一、computed计算属性 1.概念 基于现有的数据&#xff0c;计算出来的新属性。 依赖的数据变化&#xff0c;自动重新计算。 2.语法 声明在 computed 配置项中&#xff0c;一个计算属性对应一个函数 使用起来和普通属性一样使用 {{ 计算属性名}} 3.注意 computed配置项和da…

探索网络定位与连接:域名和端口的关键角色

目录 域名 域名的作用 域名的结构 域名的解析配置 父域名、子域名​编辑 https的作用 端口 图解端口 端口怎么用 判断网站是否存活 端口的作用 域名 域名是互联网上用于标识网站的一种易于记忆的地址。 域名是互联网基础架构的一个重要组成部分&#xff0c;它为网…