详细的多级示例
问题提出:为什么多级页表会节省空间以及在多级页表的情况下如何将虚拟地址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个页表项,为什么这么分呢?证明如下:
- PTD.num *PTE.num = PTE.sum
- Page.Size = 64Byte
- SizeOf(PTE) = 4Byte
- SizeOf(PTD) = 4Byte
解释:
初始构建的页表项总量是相同的,总不能用传统分页放得下,用多级分页就放不下了。
页的大小是64字节,PTE和PTD的大小都是4byte,正好一页放16个。
也许会有疑问,这样都是256项,何以见得多级分页节省内存呢?下面以一个具体例子说明:
表20.2中Page Directory下只有PFN=100或101时才有效,这时才会构建它们对应的页表,而其余的都不会构建,但是在传统的分页机制中,那些无效的页目录中的页表也会被构建。
那如何从虚拟地址转换为物理地址呢 ?
假设虚拟地址为:0x3f80
- 转换为14位二进制:1111 1110 00 0000
- 页目录有16项PTD,因此是4位,1111,表示第15项,读取表20.2对应的值为101,表明下一次要检索的表为PFN:101,页表项也有16个,也是4位,读到1110,因此是第14项,对应55,即PFN=55,OFFSET为剩下的000000
- 得到物理地址为:0011 0111 00 0000(0x0DC0)