多级页表示例分析

本文介绍了多级页表如何通过分页机制节省内存空间,以16kb地址空间和64byte页大小为例,详细解析了页目录和页表的构建,并通过实例说明了在多级页表中如何将虚拟地址转换为物理地址。通过对比,揭示了多级页表在减少无效页表项上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细的多级示例

问题提出:为什么多级页表会节省空间以及在多级页表的情况下如何将虚拟地址VA转换为物理地址PA?

条件设定:

地址空间大小:16kb

页大小:64byte

过程说明

对于16kb ( 2 14 ) (2^{14}) (214)的地址大小空间,大小为64byte ( 2 6 ) (2^{6}) (26)的页,如果使用传统的分页机制,则需要 ( 2 14 / 2 6 = 2 8 ) (2^{14}/2^{6}=2^{8}) (214/26=28)个页表项。现在我们同样构建 2 8 2^{8} 28个页表项,但是使用多级分页的形式,也就是说分为16个页目录,每个页目录放16个页表项,为什么这么分呢?证明如下:

  1. PTD.num *PTE.num = PTE.sum
  2. Page.Size = 64Byte
  3. SizeOf(PTE) = 4Byte
  4. SizeOf(PTD) = 4Byte

解释:
初始构建的页表项总量是相同的,总不能用传统分页放得下,用多级分页就放不下了。
页的大小是64字节,PTE和PTD的大小都是4byte,正好一页放16个。

也许会有疑问,这样都是256项,何以见得多级分页节省内存呢?下面以一个具体例子说明:

表20.2中Page Directory下只有PFN=100或101时才有效,这时才会构建它们对应的页表,而其余的都不会构建,但是在传统的分页机制中,那些无效的页目录中的页表也会被构建。

请添加图片描述

那如何从虚拟地址转换为物理地址呢 ?

假设虚拟地址为:0x3f80

  1. 转换为14位二进制:1111 1110 00 0000
  2. 页目录有16项PTD,因此是4位,1111,表示第15项,读取表20.2对应的值为101,表明下一次要检索的表为PFN:101,页表项也有16个,也是4位,读到1110,因此是第14项,对应55,即PFN=55,OFFSET为剩下的000000
  3. 得到物理地址为:0011 0111 00 0000(0x0DC0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值