操作系统-----程序的逻辑地址和物理地址+程序在内存中的编译链接装入方式

前提知识:

1.程序是先要放在内存上,才能被cpu执行的。

2.内存

内存就像酒店里的一个个小房间,每个小房间都有编号:

假设有4个学号为1,2,3,4的同学,入住酒店时分别按学号递增次序入住酒店房间,即 1,2,3,4的同学就入住6,7,8,9号房间。那么1,2,3,4就是4个同学的相对地址,也叫逻辑地址,6,7,8,9是同学实际所在的地方,是绝对地址,又叫物理地址

如果知道某个同学的逻辑地址,和起始房间号,那是可以找到这个同学的,例如B同学的学号为2,则他住的房间号就是6+2-1。

同理,内存也是这样的,如下:

内存中,每个存储单元(小房间)也是有固定大小的。

1.如果计算机按[字节编址],则每个存储单元的大小为1个字节,即8个二进制位。

2.如果计算机按[字编址],且是字长为16位,即每个字的大小=存储单位大小=16个二进制位。

从写程序到程序运行:

一共会经过三个步骤:

1.编译:由编译程序把源代码编译成目标模块。(把高级语言转换成机器语言)

2.链接:由链接程序把编译好的目标模块,以及运行所需的库函数链接在一起,形成一个完整的可装入模块

3.装入:把链接好的模块送入内存。

总结:

1.源程序编译好后,形成的一组目标模块里面都是逻辑地址。

2.然后通过链接把目标模块各自的逻辑地址整合到一块。

3.通过装入把完整的逻辑地址转成在内存中的物理地址。

 

链接的三种方式:

1.静态链接:

在程序运行前,先将各个目标模块和需要的库函数链接在一起,形成一个可执行文件。之后就不分开了。

2.装入时动态链接:

在把各个目标模块装入内存时,边装入边链接。

3.运行时动态链接:(现在基本都是用这种)

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

 

装入的三种方式:

(即用不同的三种方法实现逻辑地址到物理地址的转换

1.绝对装入(只适合单道程序环境)

在编译时,程序员必须给出程序装在内存的位置(物理地址),然后装入时,直接装入该位置。

如下图,编译,链接后的程序在装入前就应该被设置好了物理地址了。

2.静态重定位

静态重定位:在装入之前的可执行文件都是逻辑地址,装入时通过指定一个初始的物理地址位置,然后把可执行文件整个放进内存里,如果内存空间不够,是无法装入内存的。而且在运行过程中,是不能移动位置的,也不能再申请空间,装入了就是装入了。比上一种方法好的地方是不用人工指定装入的物理地址。

3.动态重定位(现在基本都是用这种)

动态重定位即在程序运行过程中要访问数据时再进行逻辑地址物理地址的变换。

上面2个方法都需要把程序整个装入内存才能开始运行。但是动态重定位,则可以把程序的一部分放进内存就可以运行,其他部分当用到再放进内存。

 

总结:

绝对装入:在编译时就知道程序将放入内存中的那个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。绝对装入只适用于单道程序环境。

静态重定向:装入模块中的地址还是逻辑地址,直到真正装入时将逻辑地址变换位物理地址,程序运行期间无法移动

动态重定向:现代技术机基本都用这种技术。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正执行时才发生。这种方式需要一个重定位寄存器的支持。

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值