存储器的层次结构
按照速度、容量和成本划分,存储器系统构成一个层次结构。
程序的装入和链接
一个用户源程序要变为在内存中可执行的程序,通常要进行以下处理:
编译:由编译程序将用户源程序编译成若干个目标模块。
链接:由链接程序将目标模块和相应的库函数链接成装入模块。
装入:由装入程序将装入模块装入内存。
基本概念
逻辑地址(相对地址,虚地址)
- 其首地址为 0,其余指令中的地址都相对于首地址而编址。用户的程序经过汇编或编译后形成目标代码,目标代码通常采用相对地址的形式。
- 不能用逻辑地址在内存中读取信息。
物理地址(绝对地址,实地址)
- 内存中存储单元的地址,可直接寻址。
地址映射(地址转换)
为了保证 CPU 执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。
程序的装入
1. 绝对装入方式
- 在编译时,如果能够事先知道程序将驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
- 绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存中的地址完全相同,故不需对程序和数据的地址进行修改。
- 该装入方式只适用于单道程序环境。
- 绝对地址既可在编译时给出,也可由程序员直接赋予。
- 要求程序员熟悉内存的使用情况。一旦程序或数据被修改后,可能要改变程序中的所有地址。
2. 可重定位装入方式
重定位:由于一个作业装入到与其地址空间不一致的存储空间所引起的,需对其有关地址部分进行调整的过程就称为重定位(实质是一个地址变换过程/地址映射过程) 。
为什么需要重定位:当程序装入内存时,操作系统要为该程序分配一个合适的内存空间,由于程序的逻辑地址与分配到内存物理地址不一致,而 CPU 执行指令时是按物理地址进行的,所以要进行地址转换。
可重定位装入方式:事先不知用户程序在内存的驻留位置,装入程序在装入时根据内存的实际情况把相对地址(逻辑地址)转换为绝对地址,装入到适当的位置。 (在装入时进行地址转换)
重定位基本概念
根据地址变换进行的时间及采用技术手段不同,可分为静态重定位和动态重定位两类。
静态重定位
- 当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
- 一般在装入内存时由软件完成。
动态重定位
- 在程序运行过程中要访问数据时再进行地址变换(即在逐条指令执行时完成地址映射) 。一般为了提高效率,此工作由硬件地址映射机制来完成。
- 硬件(寄存器)支持,软硬件结合完成。
动态运行时装入方式
- 可重定位装入方式不允许程序运行时在内存中移动位置。而实际情况是程序在内存中的位置经常要改变。程序在内存中的移动意味着它的物理位置发生了变化,这时必须对程序和数据的地址 (绝对地址) 进行修改后方能运行。
- 为了保证程序在内存中的位置可以改变。装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是在程序运行时才进行。
- 这种方式需要一个重定位寄存器来支持,在程序运行过程中进行地址转换。
程序的链接
静态链接
静态链接方式是一种事先链接方式,即在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装入模块 (执行文件),以后不再拆开。
实现静态链接应解决的问题:
- 相对地址的修改
- 变换外部调用符号
存在问题:
- 不便于对目标模块的修改和更新。
- 无法实现对目标模块的共享。
装入时动态链接
装入时动态链接方式是把一组目标模块在装入内存时边装入边链接的方式。
各目标模块分开存放,便于修改和更新。
便于实现对目标模块的共享。
存在问题:
- 由于把程序运行所有可能用到的目标模块在装入时均全部链接在一起,所以将会把一些可能不会运行的目标模块也链接进去。如程序中的错误处理模块。
运行时动态链接方式
由于事先无法知道要运行哪些模块,装入时动态链接方式只能是将所有可能要运行到的模块都全部装入内存,并在装入时全部链接在一起,显然这是低效的。运行时动态链接方式在程序运行中需要某些目标模块时,才对它们进行链接的方式。具有高效且节省内存空间的优点。