多级分页如何节省内存?

时间:2015-10-21 12:17:57

标签: x86 operating-system paging virtual-address-space

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

让一个32位的虚拟地址和一个页面为4 KiB然后我将有2个 20 页/页表项。
让一个页表项的大小为4个字节,因此页表的大小为2 20 * 4个字节。

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

我有一个页表目录,该目录由虚拟地址的最重要的10位索引,因此它有2个 10 条目并且指向2 10 不同页表(即2 nd 级别) 每个2 nd 级别表再次可以通过(中间)10位索引,相应的条目将保存实际的页面帧编号。

我的问题是:

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

1 个答案:

答案 0 :(得分:1)

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

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

并且访问物理地址就像

(page table entry)->(offset)


为了减小这个大页面表的大小,采用了多级pagin方案,将大小减小到

2^10 Bytes * 4 + 2^10 Bytes * 4 = 8 KiB

并将虚拟地址的分辨率更改为物理地址

(page directory entry)->(page table entry)->(offset)

这节省了一些字节(4 MiB - 8 KiB),但有一个缺点:需要一个额外的内存引用来将虚拟地址转换为物理地址。在这里,TLB(Translation Lookaside Buffer)发挥作用。它是(与L1缓存相比)小缓存,并将虚拟地址与硬件中的物理地址的关联存储起来。这里使用特殊硬件,与哈希表(C ++标准库中的std::unordered_map)相当,不同之处在于它在硬件中实现,因此速度更快。


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

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