文章目录
  1. 背景
  2. 段式存储管理
  3. 页式存储管理
  4. 页表
  5. 快表与多级页表
    1. 快表
    2. 多级页表
  6. 页映射机制
  7. 开启页表机制

背景

如果使用连续内存分配,有时不一定有满足要求的一块连续的物理内存;此外,连续内存分配产生的内/外碎片也降低内存分配效率,并且分配了的内存空间无法动态调整。

段式存储管理

段的访问机制为[段选择符 : 段偏移量],MMU通过段选择符索引段描述符表中的段描述符,以此获得段基址;在开启分页机制之前,段基址+段内偏移=物理地址,而在开启分页机制之后,段基址+段内偏移=线性地址;线性地址在下一节介绍。

页式存储管理

开启分页机制后,逻辑地址经上述转换得到的是线性地址,线性地址转换为物理地址的原理如下:

 

转换过程中所用到的页表在下一节介绍。此外,页目录表是存放页表地址的页表。

页表

页表主要用来存放页框地址,MMU通过线性地址中的页表字段索引页表中的页表项,页表项的结构如下图所示:

 

可以看出,页表项中除了记录对应页框的物理地址,还存放一些控制位(如存在位P);

但是在线性地址转物理地址的原理图中可以看到除了页表之外,还有页目录表,这就是下一节要介绍的多级页表。

快表与多级页表

快表

为提高内存访问效率,会将访问过的页表项缓存到CPU的关联存储器中,这一区域称为快表,相比在页表中查找,在快表中查找会快很多(CPU的处理速度比内存中的访问速度快很多);于是,在访问内存时,首先在快表中查找页表项,若快表中缓存了此页表项,直接从快表中读取此页表项然后去访问相应的物理地址即可,若快表中未缓存此页表项,接下来则需要通过页表查询页表项,并且将此页表项缓存到CPU的关联存储器中。

多级页表

通过间接引用,将线性地址分为若干级,在转换物理地址时,通过各级页表的索引(上一级索引的页表项中的页框地址作为下一级页表的地址)最终找到页表项。得到的页表项中的页框地址加上页内偏移就是要访问的物理内存地址。

如下是两级页表寻址的示意图:

 

页表自映射:考虑一个非常特殊的页表项:页目录表对应的页表项。

页表也是页,因此页目录表也是页表。因此,页目录表中必然有一个指向页目录表的页表项;如下图所示:

 

页目录表对应的页表项的线性地址记为B1|B2|B3;下面解释为何将B1、B2与B3标注在图所示位置。

图中阴影页表项就是指向页目录表的页表项,而每个页表项占4个字节,因此4×B3应该标注在此;

将页目录表看作一个页,而指向这个页的页目录项就是图中阴影页表项,因此4×B2应该标注在此;

将页目录表看作一个页表,页目录表中指向这个页表的页目录项就是图中阴影页表项,因此B1应该标注在此;

页映射机制

 

开启页表机制