操作系统-----程序的逻辑地址和物理地址+程序在内存中的编译链接装入方式
前提知识:
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个方法都需要把程序整个装入内存才能开始运行。但是动态重定位,则可以把程序的一部分放进内存就可以运行,其他部分当用到再放进内存。