目录
3.1 内存管理概念
3.1.1 内存管理的基本概念
内存管理的功能
- 内存空间的分配和回收
- 地址转换
- 内存空间的扩充
- 存储保护
逻辑地址空间和物理地址空间
逻辑地址:程序给出的地址(相对地址)
物理地址:程序加载到的不同的存储单元(绝对地址)
- 链接后形成逻辑地址空间
- 装入后形成物理地址空间,装入程序通过将逻辑地址转换为物理地址,这个过程称为地址重定位
- 操作系统通过内存管理部件(MMU)将进程使用的逻辑地址转换为物理地址。
程序的链接与装入
- 编辑源代码文件
- 编译:由编译程序将用户源代码编译成若干目标模块
- 链接:由目标模块生成装入模块,链接后形成完整的逻辑地址
- 装入:将装入模块装入内存,装入后形成物理地址
链接
- 静态链接(装入前链接成一个完整装入模块)
在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装入模块,以后不再拆开。将几个目标模块装配成一个装入模块时,需要解决两个问题:- ①修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成一个装入模块时要修改相对地址。
- ②变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。
- 装入时动态链接(运行前边装入边链接)
将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享。 - 运行时动态链接(运行时需要目标模块才能装入并链接)
在程序执行中需要某目标模块时,才对它进行链接。凡在程序执行中未用到的目标模块,都不会被调入内存和链接到装入模块上。其优点是能加快程序的装入过程,还可节省内存空间。
地址变换
- 绝对装入(编译时产生绝对地址)
- 在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存
- 绝对装入只适用于单道程序环境
- 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。
- 静态重定位/可重定位装入(装入时将逻辑地址转换为物理地址)
- 编译、链接后的装入模块的地址都是从0开始的指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)
- 重定位:装入时对目标程序中的指令和数据的修改过程
- 特点
- 是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。
- 作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间
- 动态重定位/动态运行时装入(运行时将逻辑地址转换为物理地址,需设置定位寄存器)
- 重定位寄存器:存放装入模块存放的起始位置
- 特点
- 可将程序分配到不连续的存储区中
- 在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;
- 便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
内存共享
- 并不是所有的进程内存空间都适合共享,只有那些只读的区域才可以共享。
- 可重入代码(纯代码),是一种允许多个进程同时访问但不允许被任何进程修改的代码
- 但在实际执行时,也可以为每个进程配以局部数据区,将在执行中可能改变的部分复制到该数据区,这样,程序在执行时只需对该私有数据区中的内存进行修改,并不去改变共享的代码。
内存保护
内存保护可采取两种方法
- 在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界
- 采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。
- 加载重定位寄存器和界地址寄存器时必须使用特权指令,只有操作系统内核才可以加载这两个存储器。