操作系统笔记(6)-分页

简介

  • 将空间切成不同长度的分片以后,空间本身会 碎片化(fragmented),随着时间推移,分配内存会变得比较困难

  • 因此,出现了另一种叫作 分页 思想: 将空间分割成 固定 长度的分片,每个单元称为一页

  • 相应地,把物理内存看成是定长槽块的阵列,叫做 页帧(page frame),每个这样的 页帧 包含一个虚拟内存页

如何映射到真实的物理地址

  • 接下来,我们关心如何将虚拟页映射到物理页,首先为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存了一个数据结构,称为 页表(page table)
  • 页表 的主要作用是为地址空间的每个虚拟页面保存 地址转换,从而让我们知道每个页在物理内存中的位置
  • 假设单页的大小为 16B ,以一个 64B 的虚拟地址和一个 128B 的物理地址为例,它们的 页表页帧 分布如下图:

页表分布

  • 我们可以用一个 6 位的二进制数来表示虚拟地址(2^6 = 64),由于分为了 4 页,我们可以用高两位来表示地址属于哪一页,也叫 虚拟页面号,然后用剩余四位来表示当先页的 偏移量(offset)
  • 如图中的第 0 页对应的 物理帧号(PFN) 为3,那么我们只需要将 虚拟页面号 替换成物理帧即可,而 偏移量 不用改变

页表中究竟有什么

  • 页表就是一种数据结构,用于将虚拟地址映射到物理地址,因此任何数据结构都可以采用,以最简单的 线性页表(linear page table) 为例,它就是一个数组
  • 操作系统通过虚拟页号检索该数组,找到 页表项(PTE),然后找到期望的物理帧号
  • PTE 中除了物理帧号外,还有一些额外的位来表示相关信息,以 x86 架构的 页表项 为例,其结构如下图:

PTE

  • 存在位(P) :表示该页是在物理存储器还是磁盘上
  • 读写位(R/W) :确定是否允许写入该页面
  • 用户/超级用户位(U/S) :确定用户模式进程是否可以访问该页面
  • (PWT、PCD、PAT 和 G) :确定硬件缓存如何为这些页面工作
  • 访问位(A) :确定是否可以访问
  • 脏位(D) :表明页面被带入内存后是否被修改过
  • 页帧号(PFN)

小结

  • 与以前的方法(如 分段)相比,分页有许多优点。首先,它不会导致外部碎片,因为分页将内存划分为固定大小的单元。其次,它非常灵活,支持稀疏虚拟地址空间
  • 但是它会导致较慢的机器和内存浪费(内存被页表塞满而不是有用的应用程序数据),因此后面有一些更好的做法,比如 多级页表 ,它将页号不断细分为多级,高层的页表放在内存中,低层的放在硬盘里,然后查找的时候调入内存中即可