内存管理
我们下面讨论的内存均为物理内存。
内存管理方案:
1、分区:程序加载时,将程序加载到一块分区上。
(1)、固定分区(内部碎片;操作系统启动前已经分配好)
大小相等的固定分区
大小不等的固定分区
(2)、动态分区(外部碎片;进程执行时,才会动态分配内存空间)
2、分页
类似于大小相等的固定分区,系统初始化时,将内存划分为大小相等的页帧(4k),程序在磁盘上的存储,也是按照4k的页面进行存储。加载程序时,操作系统为每一个进程维护一个页表。一个进程可以不连续的在内存上占据多个页帧
3、分段
加载程序时,根据程序的段,将程序加载到内存上,操作系统为每一个进程维护一个段表,一个进程可以不连续的在内存上占据多个段。
分页与分段的区别:每一个页帧的大小是固定的,而每个段是根据程序的段分大小,大小不固定。
4、伙伴系统
分配时,根据请求的大小将内存空间不断地折半,直到以最小的空间分配给请求的进程,回收空间时,如果左或者右又跟它大小相等的空闲区块就合并成一个大的区块,可以一直合并,直到左右没有等大的空闲区块为止。(实现时可使用二叉树)
5、交换分区
交换分区就是在磁盘上扩展的内存空间,但是这块空间是以内存的方式来管理的,作为对内存的补充。当内存空间不足时,才会将内存上的部分数据交换到交换分区上,这种交换的方法成为MMU,使得内存上驻留更多的进程,也可以执行比内存大的进程。
X86下的地址映射
1、实地址模式:
DS << 4 + IP = 物理地址
段基址 逻辑地址/偏移地址/偏移量
80386之前 没有操作系统时
为了防止恶意篡改IP值导致系统崩溃,从80386有了操作系统之后开始更新成了保存基址大小权限的方式寻址
在原有的基础上加了GDTR(存放基址大小和权限)、LDTR,并将原16位IP寄存器换成了IPE 32位的寄存器,原来的DS,CS,SS寄存器就用来存放GDTR数组的下标值(前13位)
GDTR(32位):全局段描述符表寄存器
LDTR(32位):局部段描述符表寄存器
2、保护地址模式: