我对多级分页方案的概念感到困惑。
设一个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,PSE,PAE,通过更多级别的页表,更大的页面大小(2 MiB,4 MiB甚至1 GiB)以及更大的物理地址空间(使用PAE最多为64 GiB)来改变机制,导致更多级别的页表。 x86-64的虚拟地址大小为48位,导致每个进程巨大地址空间(几个TiB)。
请注意页面和页面框架之间的区别。页面是数据,页面框架是物理内存中页面被映射到的区域。 有系统,其中
page's size = x * page frame's size
和x > 1
。关于x86 - 多级分页如何节省内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33259119/