OS-深入理解多级页表

OS-深入理解多级页表

  • 多级页表存储什么?
  • 寻址?

主要涉及两个问题,其一是对操作系统中多级页表存储什么的探究;其二是对计算机寻址的理解

多级页表存储什么?

多级分页的原理不再赘述,下面主要看这个图,注意到页目录表与页表的每一项都是4B,这4B是用来存什么呢?

OS-深入理解多级页表_第1张图片

  • 页表
    对于页表而言,页表项是为了存储指向物理页的指针,因为地址有32位,因此用4B来存储。事实上,如果仅仅考虑页表与物理页的联系时,这里完全可以不需要用完4B的长度,因为我们只需要存储物理页的首地址,便可以通过虚拟地址的Offset来得到虚拟地址物理地址
    p a = 某 物 理 页 的 首 地 址 + O f f s e t pa = 某物理页的首地址 + Offset pa=+Offset
    物理页一共有 2 32 B / 2 12 B = 2 20 2^{32} B/ 2^{12} B = 2^{20} 232B/212B=220,因此,我们只需要20位地址即可表示所有物理页的首地址
    (可能会有人问:32位机,另外12位怎么办呢?我的理解是,可以用高/低20位存储这些物理页的首地址,其余空余的bit用于存储其他信息

  • 目录页
    对于目录页而言,同理,目录项是为了存储指向页表的指针,而一个页表的大小为1K(页号:10位) * 4B(每一页表项4B),因此同样,如果仅仅考虑目录页与页表的联系时,我们只用20位地址即可。

  • 然而
    由于我们还需要其他诸多bit为位用于保存额外信息,在真实系统中,仅仅考虑是不行的,如下图所示。Intel x86用了12位来表示一些额外信息,20+12 = 32位,因此用4B自有他的理由。
    在这里插入图片描述

寻址?

寻址这里我困扰了许久。主要是关于页目录号、页号Offset的统一

OS-深入理解多级页表_第2张图片

上图是一个多级页表的逻辑地址格式。我们知道,计算机默认按字节进行编址,因此,我们可以根据Offset的位数轻易计算出一个物理页的大小
物 理 页 大 小 = 2 12 B = 4 K B 物理页大小 = 2^{12}B=4KB =212B=4KB

下面,我想问一个问题:页表的大小是多少呢?
你会很坦然的说: 2 10 ∗ 4 B = 4 K B 2^{10} * 4B=4KB 2104B=4KB。 是的,我们在前面谈“目录项的存储”中也很自然地像这样推导出了一个页表的大小。
那么,是否会有这样的疑问:为什么计算Offset的时候是按字节寻址,计算页表大小的时候又是按照字寻址了呢?(误认为 2 10 2^{10} 210代表地址范围, 4B代表一个字)
2 10 2^{10} 210真的代表地址范围吗?,事实上, 2 10 2^{10} 210代表的是索引(下标、页号)范围,我们假设页号为n,那么对应页表项的首地址为:
a d d r = n ∗ 4 ( 因 为 一 个 页 表 项 有 4 个 字 节 ) addr = n * 4(因为一个页表项有4个字节) addr=n44
例如,1号页,首地址为4;2号页,首地址为8……
因此,公式 2 10 ∗ 4 B = 4 K B 2^{10} * 4B=4KB 2104B=4KB并不表示计算机按字寻址,它仅仅表示,一个索引对应4B,而页表共有1K个索引,因此页表大小为4KB

你可能感兴趣的:(操作系统,操作系统)