我对多级分页方案的概念感到困惑。
让一个32位的虚拟地址和一个页面为4 KiB然后我将有2个 20 页/页表项。
让一个页表项的大小为4个字节,因此页表的大小为2 20 * 4个字节。
如果我将虚拟地址划分为10 | 10 | 12
,那么我理解的是:
我有一个页表目录,该目录由虚拟地址的最重要的10位索引,因此它有2个 10 条目并且指向2 10 不同页表(即2 nd 级别) 每个2 nd 级别表再次可以通过(中间)10位索引,相应的条目将保存实际的页面帧编号。
我的问题是:
答案 0 :(得分:1)
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,PSE,PAE,稍微改变了页面表级别,更大页面大小(2 MiB,4 MiB,甚至1 GiB)的机制,以及更大的物理地址空间(最多64 GiB与PAE),导致更多级别的页表。 x86-64的虚拟地址大小为48位,导致每个进程的巨大地址空间(几个TiB)。
注意页面和页面框架之间的区别。页面是数据,页面框架是物理内存中映射页面的区域。 是系统page's size = x * page frame's size
,其中x > 1
。