一、概述
存储器是计算机系统的重要组成部分,所以存储器的管理是操作系统最主要的功能之一。程序的指令和数据只有被调入内存(RAM)里才能被CPU直接访问,程序才能够被执行。软件系统需要的内存容量在不断地增加,所以内存的容量仍然是计算机硬件中最关键的、且又是最紧张的“瓶颈”资源。如何对存储器进行有效的管理,不仅直接影响到它的利用率,而且还对系统的性能有重大影响。存储管理的主要对象是内存。
1、存储层次结构
存储器是处理器处理的信息的来源与归宿,占据着重要地位。但任何一种存储设备都无法在速度与容量两个方面同时满足用户的需求。为解决速度和容量之间的矛盾,冯·诺依曼计算机系统中,采用了三级或更多级的存储器来组成存储层次结构,高一级为CPU寄存器和高速缓存器,中间是主存(可执行的存储器),最低一级为辅存。通过采用特殊的存储技术,主存与辅存两级可以进一步优化成多级。在存储层次结构中,高层的存储器往往是速度很快、但成本高使容量有限,而接近底部的存储器容量很大、成本低,相对访问速度则慢。各种存储设备组成存储层次结构,如图所示。
2、存储管理的功能
操作系统为了有效地管理计算机的内存资源,应该具备以下四大功能:内存分配、内存保护、地址映射、内存扩充。
- 内存分配
内存分配的主要任务是:为每一道程序分配内存空间,使它们“各得其所”;当程序撤消时,则收回它占用的内存空间。分配时注意提高存储器的利用率。 - 地址映射
目标程序所访问的地址是逻辑地址集合的地址空间,而内存空间是内存中物理地址的集合,在多道程序环境下,这两者是不一致的,因此,存储管理必须提供地址映射功能,用于把程序地址空间中的逻辑地址转换为内存空间中对应的物理地址。 - 内存保护
内存保护的任务是确保每道程序都在自己的内存空间运行,互不干扰。保护系统程序区不被用户侵犯(有意或无意的),不允许用户程序读写不属于自己地址空间的数据(系统区地址空间,其他用户程序的地址空间)。 - 内存扩充
内存扩充的任务是从逻辑上来扩充内存容量,使用户认为系统所拥有的内存空间远比其实际的内存空间(硬件RAM)大的多。
二、地址重定位
在源程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合称为“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块。然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块中的地址称为相对地址(或称为“逻辑地址”),而把相对地址的集合称为“相对地址空间/逻辑地址空间”或简称为“地址空间”。装配模块虽然具有统一的地址空间,但是仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与地址有关的代码,这一过程称为地址重定位。
地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。程序的名字空间、地址空间和存储空间之间的关系如图所示。
地址重定位完成把相对地址转换成内存中的绝对地址,这个过程称为地址映射(map)。按照重定位的时机,可分为静态重定位和动态重定位。
1、静态重定位
静态重定位是在程序执行之前进行重定位。它根据装配模块将要装入的内存起始地址,直接修改装配模块中的有关使用地址的指令。在图中以“0”作为参考地址的装配模块,要装入以10000为起始地址的存储空间。显然在装入程序之前,程序必须做一些修改才能正确运行。
静态重定位虽然有无须硬件支持的优点,但是也存在明显的缺点:一是程序重定位以后就不能在内存中移动;二是要求程序的存储空间是连续的,不能把程序存储到若干个不连续的区域中。
2、动态重定位
动态重定位是指在程序执行过程中进行地址重定位,即在每次访问内存单元前才进行地址变换。动态重定位可使装配模块不加任何修改就装入内存,但是它需要硬件—重定位寄存器的支持。下图给出了动态重定位的示意图。
程序的目标模块在装入内存时,与地址有关的指令都无须进行修改,如在图中LOAD 1,2500这条指令中仍保持相对地址2500。当该指令被操作系统取到中央处理器指令寄存器上执行时,操作系统首先把该模块装入的实际起始地址减去目标模块的相对基地址(图中该模块的基地址为0),然后将其差值10000装入重定位寄存器。
当CPU执行该指令时,地址变换硬件逻辑自动将指令中的逻辑地址2500与重定位寄存器中的值相加,再