我对多级分页方案的概念感到困惑。

设一个32位虚拟地址,一页为4 KiB,那么我将有220页/页的表条目。
设一个页表项的大小为4字节,因此页表的大小为220 * 4字节。

如果我将虚拟地址划分为10 | 10 | 12,那么我的理解是:

我有一个页表目录,该目录由虚拟地址的最高10位索引,因此它具有210个条目并指向210个不同的页表(即在第二级)。
每个第二级表也可以用(中间)10位索引,并且相应的条目将保留实际的页帧号。

我的问题是:

  • 这完全正确吗?
  • 页目录和页表的大小是否相同?
  • 多级分页方案如何节省内存?
  • 最佳答案

    是的,这都是正确的。只有一个级别的页表和每个条目4个字节,页表将具有

    4 GiB (maximal physical address space) / 4 KiB (size of one page frame) * 4 Bytes = 4 MiB
    

    而访问物理地址就像
    (page table entry)->(offset)
    

    为了减小此大页表的大小,采用了多级分页方案,将大小减小为
    2^10 Bytes * 4 + 2^10 Bytes * 4 = 8 KiB
    

    并将虚拟地址的分辨率更改为物理地址,以
    (page directory entry)->(page table entry)->(offset)
    

    这样可以节省一些字节(4 MiB-8 ​​KiB),但是有一个缺点:需要一个附加的内存引用才能将虚拟地址转换为物理地址。在这里,TLB(转换后备缓冲区)开始起作用。它是一个小型缓存(与L1缓存相比),将虚拟地址与物理地址的关联存储在硬件中。这里使用的特殊硬件与哈希表(C++标准库中的std::unordered_map)相当,不同之处在于它是在硬件中实现的,因此速度更快。

    这是x86体系结构中采用的默认32位分页方案。 x86-64,PSEPAE,通过更多级别的页表,更大的页面大小(2 MiB,4 MiB甚至1 GiB)以及更大的物理地址空间(使用PAE最多为64 GiB)来改变机制,导致更多级别的页表。 x86-64的虚拟地址大小为48位,导致每个进程巨大地址空间(几个TiB)。

    请注意页面和页面框架之间的区别。页面是数据,页面框架是物理内存中页面被映射到的区域。 系统,其中page's size = x * page frame's sizex > 1

    关于x86 - 多级分页如何节省内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33259119/

    10-08 21:29