非连续内存分配
非连续内存分配允许程序使用非连续的物理地址,允许共享代码数据,支持动态加载和动态链接
实现非连续内存分配需要解决虚拟地址到物理地址的转换
1.软件实现 开销大
2.硬件实现 开销小
段式存储管理:
进程的段地址空间由多个段组成:
1.主代码段
2.子模块代码段
3.公用库代码段
4.堆栈段
5.堆数据
6.初始化数据段
7.符号表等
段的概念:表示访问方式和存储数据等属性相同的一段地址空间,段内地址要求连续,若干段足证进程逻辑地址空间。
段的访问:逻辑地址由二元组(s,addr)组成,s表示段号,addr表示段内偏移通过段号到段表中查找相应的段描述符,
每个段描述符包含了段的起始地址和段长度,存储管理单元MMU把偏移addr和段描述符中的段长度做比较判断是否越界,
如果没有越界,则段基地址+偏移得到实际访问的地址。
页式存储管理:
把物理地址空间划分为大小相同的基本分配单位:页帧(frame)
把逻辑地址空间也划分为相同大小的基本分配单位:页面(page),大小和页帧相同
页帧:
把物理地址组织成二元组(f,o),f表示帧号,o表示帧内偏移量
物理地址=f*2^s+o(低s位是偏移量,所以f需要左移s位)
页:
页内偏移=帧内偏移,但页号一般不等于帧号。用二元组(p,o)表示。
p-页号,P位,共2P个页
o-页内偏移,s位,每页2^s字节
虚拟地址=p*2^s+o(因为低s位是偏移,所以p需要向左偏移s位)
逻辑地址中页号连续,物理地址中帧号不连续。
页表:
页表保存了逻辑地址到物理地址的映射关系,由页表基址作为起始地址,由页号作为下标查找相应页表项,
页号的对应关系存储在页表中。