内存的基础知识

weblog 1102 0 0

《操作系统》

逻辑地址和物理地址

宿舍四个人一起出去旅行,四个人的学号尾号分别是0、1、2、3。住酒店时酒店给你们安排了4个房号相连的房间。四个人按学号递增次序入住房间。比如0、1、2、3号同学分别入住了5、6、7、8号房间。

四个人的编号0、1、2、3其实是一个“相对位置”,而各自入住的房间号是一个“绝对位置”。只要知道О号同学住的是房号为N的房间,那么M号同学的房号一定是N+M。

也就是说,只要知道各个同学的“相对位置”和“起始房号”,就一定可以算出所有同学的“绝对位置”

指令中的地址也可以采用这种思想。编译时产生的指令只关心“相对地址”,实际放入内存中时再想办法根据起始位置得到“绝对地址”

Eg:编译时只需确定变量x存放的相对地址是100(也就是说相对于进程在内存中的起始地址而言的地址)。CPU想要找到x在内存中的实际存放位置,只需要用进程的起始地址+100即可。

相对地址又称逻辑地址,绝对地址又称物理地址。

从写程序到程序运行

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

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

装入(装载):由装入程序将装入模块装入内存运行

装入模块装入内存

例如我们写了一段程序:

如果从内存地址为0开始存放的话,那么指令中使用的地址参数是不用改变的。

但是如果把装入模块把程序放入对了另一个地方,比如从地址为100开始

那么此时指令当中包含的地址参数就是错误的了。

所以就需要其他的装入方式来解决这些问题,主要有三种方式:

1.绝对装入

2.静态重定位

3.动态重定位

绝对装入

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。

Eg:如果知道装入模块要从地址为100的地方开始存放...

绝对装入只适用于单道程序环境。

程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。通常情况下都是编译或汇编时再转换为绝对地址。

静态重定位

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

物理地址转为绝对地址是由装入程序完成的

静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

动态重定位

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

装入后
执行时

采用动态重定位时允许程序在内存中发生移动。并且可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

链接的三种方式

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

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

运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

 


猜你喜欢
official 862 《计算机网络第七版谢希仁》 [TOC]一、数据通信系统模型  一个数据通信系统可划分为三大部分,即源系统(或发送端、发送方)、传输系统(或传输网络)和目系统(或接收端`接收方)。 源系统一般
java基础 2917 走向可分为输入流和输出流,这个走向是以,即往中读数据是输入流,从中往外写是输出流。根据处理数据类型可分为字节流和字符流1.字节流可以处理所有数据类型数据,在java中以Strea
数据库基础 2916 mysql在一个时间上加n(分钟、小时、天)等SELECTDATE_FORMAT(ADDDATE(now(),INTERVAL20MINUTE),'%Y-%m-%d%H:%i:%s')#加20
official 920 《计算机组成原理》本结构图本结构图储体是用于储数据地方,MAR是地址寄器,MDR是数据寄器。cpu想要从储体中取出数据,首先要将数据地址写入MAR寄器中,那么MAR就可以根据这个
weblog 3898 本篇文章为红黑树预备,暂且不涉及节点颜色。 二叉树左旋 左旋过程是将x右子树绕x逆时针旋转,使得x右子树成为x父节点,同时修改相关节点引用。旋转之后,二叉查找树属性仍然满足
java基础 3751 请到足够会抛出OutOfMemoryError异常。[1]栈帧是方法运行期很重要数据结构,在本书第8章中还会对帧进行详细讲解。[2]HotSpot虚拟机栈容量是不可以动态扩展,以前
java虚拟机(jvm) 2463 这里以HotSpot为例,且所说对象指普通Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象布局HotSpot虚拟机中,对象在布局可以
official 842 《操作系统》操作系统作为系统资源管理者,当然也需要对进行管理,要管些什么呢?游戏GTA大小超过60GB,按理来说这个游戏程序运行之前需要把60GB数据全部放入。然而,实际我电脑
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。