操作系统_程序的装入

  我们知道,程序要执行,必须被CPU调用执行,而前提是装入到主存中。所以程序的装入对于操作系统来说,是一件非常重要的工作。要了解程序是如何装入到主存中,我们首先来了解下逻辑地址和物理地址

  主存的存储单元以字节为单位编址,每个存储单元都有一个地址与其对应。假定主存的容量是256M,即256*1024*1024=2^28个字节(256M=256*2^10K=256*2^10*2^10B),则该主存就有2^28个字节的存储空间,起地址编号为0,1,2,…………2^28-1。这些地址称为主存的物理地址(也称为绝对地址),物理地址对应的主存空间称为物理地址空间;然而,在多道程序设计系统(如windows,linux等)中,主存中同时存放了多个用户作业。每次调入运行时,操作系统将根据主存的使用情况为用户分配主存空间,每个用户不可能预先知道其作业存放的主存的具体位置(物理位置)。因此,在用户程序中不能使用主存的物理地址。为了方便程序的编制,每个用户可以认为自己作业系统和数据存放在一组从0地址开始的连续空间中。用户程序所使用的地址称为逻辑地址(也叫相对地址或虚地址),逻辑地址对应的存储空间成为逻辑地址空间。

  下面我们来开始看看程序载入的一般步骤:编译-链接-装入。首先编译,有编译程序(Complier)将用户源代码编译城若干目标模块(Object
Module)(.obj文件);然后链接,有连接程序(Linker)将编译后形成的一组目标以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load
Module)(如.exe文件);最后装入,由装入程序(Loader)将装入模块装入主存。看下图

  将一个装入模块装入主存中,有3种方法:绝对装入方式,
静态重定位装入方式, 动态重定位装入方式。

  1:绝对装入方式。如果在编译时就知道了程序驻留在主存的具体位置,则编译程序将产生的物理地址的目标代码。绝对装入程序按照装入模块的地址,将程序和数据装入主存。模块装入后,由于程序中的逻辑地址和实际主存的地址完全相同,
所以不需要修改程序和数据的地址。
  但是,如果要程序猿直接给出程序和数据的物理地址,则要求比较高,不但要求程序猿熟悉主存的使用情况,而且一旦要修改某个地址,就可能要修改程序中所以地址,所以在程序中往往使用符号地址,在编译或汇编时将其转换为物理地址。
  注意事项:绝对装入方式只能将目标模块装入到主存事先指定的固定位置,只适用于单道程序环境。看下图。
 
  

  2:静态重定位装入方式。在装入作业时,把该作业中的指令指令和数据地址一次性全部转换为物理地址,这样在作业执行过程中无需再进行地址转换工作,这种地址转换方式称为静态重定位,这种作业装入方式称为静态重定位装入方式。如图。
 
 

  3:动态重定位装入方式。在装入作业时,装入程序直接把作业装入到所分配的主存区域中。在作业执行过程中,随着每条指令或数据的访问,由硬件地址转换机制自动地将指令中的逻辑地址转换称对应的物理地址。这种地址转换的方式是在作业执行的过程中动态完成的,所以叫动态重定位。如图。
 
 
 
注意,动态定位由硬件(基地址寄存器)和软件相互配合实现。
 采用动态重定位,由于装入主存的作业仍保持逻辑地址,所以,必要时可改变作业在主存中的存放区域。若改变了存储区域,作业仍能正确执行,则称程序是可浮动的。采用动态重定位的系统支持程序浮动(碎片整理时用到)。而静态重定位由于装入主存时作业信息都已转化为物理地址,执行过程中不再进行地址转换,所以作业执行过程中不能改变存放位置,即采用静态重定位的系统不支持程序浮动。

PS——参照机械工业出版社《操作系统教程》.
 
    图片来自Google Images.
  

时间: 05-05

操作系统_程序的装入的相关文章

【操作系统总结】存储器管理-程序的装入与连接,连续分配存储管理方式

程序的装入与连接 程序要经过编译,链接,装入才能运行 绝对转入方式 将程序装入事先指定的地址,程序装入以后逻辑地址与实际内存地址相同.要求程序员非常熟悉内存地址 可重定位方式 根据内存的具体情况将程序装入适当的位置,把装入时对程序和数据的地址修改过程称为重定位. 动态运行时的装入方式 程序对换的时候内存是改变的 可重定位不允许程序运行时在内存中移动位置.动态运行时的装入程序在把装入模块装入内存后,并不立即把装入模块转换程物理地址,而是吧这中地址转换推迟到程序真正要求执行时进行. 程序的链接 静态

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段 1. Breaseman算法绘制圆形程序 由于算法的特殊性,限制绘制第一象限部分,其他部分通过旋转绘制. 1 void CCGProjectWorkView::bresenHam_1P4Circle(int radium, const float lineColor[]) 2 { 3 int pointX, pointY, deltD, deltHD, deltDV, direction; 4 pointX = 0; 5 pointY

逻辑运算_三元运算符_程序流程控制

 //逻辑运算符   /*       逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 .      "&"和"&&"的区别: 单&时,左边无论真假,右边都进行运算:       双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算.       "|"和"||"的区别同理,||表示:当左边为真

windows操作系统对于程序运行时堆栈的管理的研究

通过下面的代码得出了一个结论: 在windows操作系统中,栈空间不会释放,而是如果现有的栈空间满足函数的运行,则不再申请新的栈空间,但函数退出后也不释放栈空间:如果函数运行时占空间不够,则需要再申请新的空间: 使用malloc动态申请的空间因为位于堆空间,free后可以直接释放 #include <stdio.h> #include <Windows.h> int hello1() { int arra[1000*60];//占用的栈空间大小大概为0.2MB int i=0; f

InterviewQuestion_C#_程序题_004

分析代码,写出程序输出结果: 文件:Class1.cs using System; namespace Interview3 { class Class1 { private string str = "Class1.str"; private int i = 0; static void StringConvert(string str) { str ="string being converted."; } static void StringConvert(C

简单的文件同步备份程序,仅支持单向同步_程序及源代码

1. 程序 http://files.cnblogs.com/files/fjwuyongzhi/FileSync.zip 2. 源代码 http://files.cnblogs.com/files/fjwuyongzhi/FileSync2016080405.rar 此备份程序,主要用于办公云化,将文件备份到本地电脑等(如下图), 也可以用于其它单向的文件备份的情况. 免责声明:本程序不提供任何承诺,请自行确认.

J2SE之基础语法_程序的格式_运算符

程序的格式 运算符 1.自加和自减运算符 2.逻辑运算符 3.赋值运算符与扩展赋值运算符 4.字符串连接符 5.表达式 6.三目条件运算符

InterviewQuestion_C#_程序题_003

分析代码,写出程序的输出结果: 文件:Program.cs 1 using System; 2 3 namespace Interview2 4 { 5 class A 6 { 7 public static int X; 8 static A() 9 { 10 X = B.Y + 1; 11 } 12 } 13 14 class B 15 { 16 public static int Y = A.X + 1; 17 static B() { } 18 static void Main() 19

程序的链接和装入及Linux下动态链接的实现

http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行的当属动态链接.动态装入方法.本文首先回顾了链接器和装入器的基本工作原理及这一技术的发展历史,然后通过实际的例子剖析了Linux系统下动态链接的实现.了解底层关键技术的实现细节对系统分析和设计人员无疑是必须的,尤其当我们在面对实时系统,需要对程序执行时的时空效率有着精确的度量和把握时,这种知识更显重

操作系统之存储器管理

存储器的层次结构 存储器的层次如下图: 上图中,寄存器和主存储器称为可执行存储器.高速缓存的作用是缓和CPU与内存之间的速度差异,主要由硬件实现.磁盘缓存的出现是由于内存容量不够,需要引入磁盘,然而磁盘的I/O速度远低于主存的访问速度,为了缓和两者之间在速度上的差异,设置了磁盘缓存.磁盘缓存与高速缓存不同,它本身并不是实际存在的存储器,是利用主存中的部分空间暂时存放从磁盘中读出写入的信息. 程序的装入与链接 用户程序需要运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常要经历一下