1、操作系统内存管理模块
1. 内存管理方案
分区
分页
分段
伙伴系统
段页式
交换分区
1)分区:程序加载时,将程序整体加载到一块分区上;
固定分区: 内存碎片(大小相等/不等的固定分区)
动态分区:外部碎片
2)分页:类似于大小相等的固定分区,
系统初始化时,将内存划分为大小相等的页帧(4K),程序在磁盘上的存储也是按照4K的页面进行存储,
程序加载时,操作系统为每一个进程维护一个页表; 一个进程可以不连续的在内存上占据多个页帧;
3)分段:程序加载时,根据程序的段,将程序加载到内存上,
操作系统为每一个进程维护一个段表, 一个进程可以不连续的在内存上占据多个段;
每个页帧的大小是固定的,而每个段是根据程序的段分大小,大小不固定;
4)伙伴系统:分配时,根据请求的大小将内存空间不断的折半,直到以最小的空间分配给请求的进程,
回收空间时,如果左或右有和他相等的空闲区块,则合并为一个大的区块(不是一次合并)二叉树
5)交换分区:(在磁盘上扩展的内存空间)
在磁盘上开辟一块空间以管理内存的方式管理这块磁盘空间,作为对内存的补充;
在内存空间不足时,才将内存上的部分数据交换(MMU)到交换分区上,
1.可以在内存上驻留更多的进程;
2.可以执行比内存大的进程;
2、x86下的地址映射
1.实地址模式
8085:8位芯片,16的地址总线,64K,在芯片中集成16位的汇编指令;
8086:16位芯片,20位的地址总线,1M;
80386:32位CPU;
DS CS SS(ES) 16位寄存器基地址
权限: 00 最高权限
11 最低权限
13位:下标,段选择子
系统初始12页, 8180
每个段的大小必须是16的倍数,段基址也就是16的倍数,2进程数据上,后四位肯定为0;
16位的IP寄存器,偏移量,段的大小 16byte --64k
实模式下的地址映射:
DS << 4 + IP = 物理地址
段基址 逻辑地址/偏移地址/偏移量
IPE:32位寄存器
GDTR:全局段描述符表寄存器;
GDT:全局段描述符表:段基址,段大小,权限;
20段大小:2^20 = 1M
G: 0 字节 1M ,
1 页面 4K * 1M = 4G
LDTR:局部段描述符表寄存器;
LDT:局部段描述符表;
2.保护地址模式
GDTR[DS>>3].BaseAddr + IPE(IPE<Length) == 线程地址-->
段基址 逻辑地址
分段的地址映射
CRO未开分页机制-->物理地址
CRO开启了分页机制-->虚拟地址 -- 2级页面映射-- 物理地址
分页的地址映射
虚拟地址:10 10 12
下标 下标 偏移量
PD页目录 PT页表
(4G/4K = 2^20)
P位:0:则对应的页面不在物理内存上,触发缺页中断,然后MMU模块将页面置换到内存上;
1:则在物理内存上;
M位:0:数据未被修改;
1:数据被修改了;
(MMU:内存管理单元的简称,作用:地址翻译、内存保护)