一、非连续内存分配
1、为什么需要非连续内存分配?
- ▼ 连续内存分配的缺点
-
■
分配给一个程序的物理内存是连续的
■ 内存利用率较低
■ 有外碎片、内碎片问题 - ▼ 非连续内存分配的优点
-
■
一个程序的物理地址空间是非连续的
■ 更好的内存利用和管理
■ 允许共享代码与数据(共享库等…)
■ 支持动态加载和动态链接 - ▼ 非连续内存分配的缺点
-
●
如何建立虚拟地址和物理地址之间的转换
■ 软件方案
■ 硬件方案 - ▼ 两种硬件方案
-
●
分段
● 分页
二、分段
1、程序的分段地址空间
计算机程序是由很多段来组成的,有主程序、子程序、共享库等等,数据也有栈段、堆段以及共享数据段,如果能够把程序的各个段分离和共享,那么会有利于我们管理我们的程序。
该图中程序的逻辑地址空间是一段连续的地址空间,通过分段之后我们能把各个段部分有效地隔离开来,比如说可以将堆栈放到一个特定的物理地址并且用一个特定的管理权限管理起来。这样就可以让我们的程序中的某些段进行共享和隔离,以及管理。
左面的连续逻辑地址空间映射到右边的物理地址空间中时,段的顺序、位置以及地址空间的大小都有可能会发生变化,因此我们需要一定的映射机制来执行。如果用软件来执行的话,开销会非常大,所以我们就用硬件来完成这个映射机制。
2、分段寻址方案
x86 就是段寄存器+地址寄存器实现方式
上面这张图中的base和limit的箭头指向有问题
段表中存在的是逻辑地址空间中的段号与物理地址空间中的段号的对应关系。
段表中存放着两个重要的信息,一个是段的起始地址,一个是段的长度限制。
先根据逻辑地址的段号查段表中的项,可以找到一个起始地址(base)和长度限制(limit)。之后需要进行检查,判断偏移量是否大于段的长度,若大于则返回内存异常,若不大于则将偏移量加上起始地址就可以找到物理地址空间中的地址了。
操作系统建立段表