文章目录
- 1. 基本分页存储管理
- 基本地址变换机构
1. 基本分页存储管理
分页存储:
将内存空间分为一个个大小相等的分区(eg:每个分区4KB),每个分区就是一个页框
每个页框有一个编号,即页框号,页框号从0开始
注意:
- 页框=页帧=内存块=物理块=物理页面
- 页框号=页帧号=内存块号=物理块号=物理页号
将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个页或页面。
每个页面也有一个编号,即页号,页号也是从0开始。
操作系统以页框为单位为各个进程分配内存空间。进程的个页面分别放入一个页框中。
进程的页面与内存的页框是意义对应的关系。
页表:
操作系统需要找到进程的每个页面在内存的位置,需要为每个进程建立一张页表。
这张页表通常保存在进程的PCB中。
由上图可知:
- 一个进程对应一张页表
- 进程的每个页面对应一个页表项
- 每个页表项由页号和块号组成
- 页表记录进程页面和实际存放的内存块之间的映射关系
eg:
假设某系统物理内存大小为4GB,页面大小为4KB,则每个页表项至少应该为多少字节?
内存块大小(页框)=页面大小=4KB
4GB内存总共会有2^20个页框(页框号0~2^20-1)
页框号至少需要20bit进行标识,所以对应页表块号项至少是20bit(至少3字节)
页号不需要占用存储空间,因为页表项是连续存放的,因此页号可以隐藏
可以类比数组(页表存储结构是连续的)
注意:页表记录的只是内存块号,而不是内存块的起始地址,i号内存块的起始地址=i×内存块大小
基本分页的地址转化步骤
虽然进程的各个页面在内存中时离散存放的,但是各个页面内部时连续存放的
eg:访问A的逻辑地址
- 确定逻辑地址A对应的页号P
- 查找页表,找到P页面在内存中的起始地址
- 确定逻辑地址A的页内偏移量w
逻辑地址A对应的物理地址=P号页面在内存中的起始地址+页内偏移量w
页号=逻辑地址/页面长度(取结果的整数部分)
页内偏移量w=逻辑地址%页面大小(取结果的余数部分)
总结:
-
如果页面大小刚好是2的整数幂,则只需把页表中记录的物理块号拼接上页内偏移量就能得到对应的物理地址。
结构:物理块号+页内偏移量
逻辑地址结构:
eg:假设一个页面大小为4KB=4096B
基本地址变换机构
基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。
通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M(页表项数)。
进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
整个过程如下:
- 进程被调度,操作系统恢复进程的运行状态,将进程PCB中的页表的始址和页表长度放入页表寄存器上
- 首先将逻辑地址的页号分离出来,和页表寄存器中的页表长度进行越界判断,出错的话以中断的形式通知操作系统。
- 找到页表项地址(页表项地址=F+P*页表项长度)。通过页表地址的映射,找到内存块号
- 将找到的内存块号与页内偏移量w进行拼接,找到对应的物理地址。(注意,这里的页面大小默认为2的整数幂)(不是2次幂物理地址=内存块号×页面大小+页内偏移量)
需要注意:
-
比较页号P和页表长度M时,若P>=M,则产生越界中断,否则继续执行。页号是从0开始的,而页表长度至少是1,因此P=M时也会越界
-
注意区分页表项长度、页表长度、页面大小的区别。
页表长度:指的是这个页表中总共有几个页表项,即总共有几个页
页表项长度:指的是每个页表项占多大的存储空间
页面大小:指的是一个页面占多大的存储空间
在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此,页式管理中地址是一维的。
只要给出一个逻辑地址,系统就可以自动地算出页号(系统已知页面大小)、页内偏移量两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。
需要注意:
页表在内存中是连续存储的,如果已知页表在内存的起始地址为X,页表大大小为4KB,系统的物理内存的大小为4GB。
首先可以退出需要20bit(3字节)才可以表示内存块号(页号不需要保存)
所以一个页框可以存放的页表项为4KB(4096B)/3(B)=1365个。但是每个页框还会留下1B的页内碎片
因此1365号页表存放的地址为X+3*1365+1
如果每个页表项占4字节,则每个页框刚好可存放1024个页表项。这样就避免了页内碎片。