OS 二级页表

学习二级页表总是弄不清楚逻辑地址结构和物理内存存储的内容的细节,本篇文章便是我自己的一点困惑和解答。

在这里插入图片描述

预置条件:

页面大小 4KB,页表项4B,逻辑地址32位,按字节编址。

  1. 对于4B大小的页表项,可以表示 2 32 2^{32} 232个页号。
  2. 二级页表中,顶级页表只占用最多一个页面,本题中是4KB。
    a. 这个顶级页表所占页面最多可容纳4KB/4B=1024个页表项。
  3. 于是,在逻辑地址空间结构中,需要使用10bit来表示一级页表的页号(表内偏移),用于顶级页表所占页面的页面内寻址(用来找到相对应的页表项,也就是对应的二级页表)。(为什么不是12bit,因为这个顶级页表所占的页面,不是按1字节1字节存放的,而是4字节4字节存放的,总共有1024个页表项)
  4. 对于二级页号,则是用来实现页表的功能 —— 寻找逻辑地址对应的物理块号(也相当于是页框号)
  5. 页内偏移:因为是按字节编址,所以一个页面有4K个字节,需要12位来表示这么多字节,所以占用12位。
  6. 那么刚好,逻辑地址结构中,二级页号的长度也可以确定下来,便是32-10-12=10

补充:
在这里插入图片描述

那么如何从逻辑地址转换到物理地址呢?

条件:32位逻辑地址空间、页面大小4KB、页表项大小4B,以字节为编址单位
页面大小为4KB,页内偏移地址为log24K= 12位,页号部分为20位,若不采用分级页表,则仅一个页表就要占用20x4B/4KB=1024页=4MB。
页表项仅用于存储该页号所对应的物理块号,所以4B恰好对应这32位逻辑空间,需要用32bit存储这32位地址空间

输入:32位虚拟地址 0x01234567

输出:32位的实际物理地址

二级页表地址拆分规则:高10位为页目录(二级)索引,中间10位为(一级)页表索引。最后低12位为物理页(实际物理地址)内偏移量。

举例说明:输入虚拟地址 0x01234567 对其拆分二进制,我们知道十六进制到二进制是1对4位的关系,即0x0 =0000 ,0x1=0001 ,0x2=0010 ,

所以拆分得到
0000 0001 00 = 2 D
10 0011 0100 = 564 D
0101 0110 0111 = 567 H

这样分别得到页目录(二级页表)的索引值是4,页表(一级页表)的索引值是564,物理内偏移量是567H.

第一步:要去页目录(二级)中找到页表(一级)地址,也就是4*4=16,意味着该页表地址偏离页目录首地址16个字节处。从这里取出页表(一级)地址。

第二步:要去页表(一级)中找实际的物理页地址。偏移量是564*4=2256=0x8d0,加上第一步找到的页表首地址。最后就得出了实际的物理页地址。

第三步:将物理页地址加上原虚拟地址低12的偏移量,得到最终的实际物理地址。这个地址就是最后输出的结果,用它去访问内存取到数据。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45827203/article/details/126284702
os