Bis*_*hnu 5 paging x86 operating-system virtual-address-space
我对多级分页方案的概念感到困惑。
让一个 32 位虚拟地址和一个页面为 4 KiB,那么我将有 2 20页/页表条目。
设一个页表条目的大小为 4 个字节,因此页表的大小为 2 20 * 4 个字节。
如果我把虚拟地址分成10 | 10 | 12
,那么我的理解是:
我有一个页表目录,它由虚拟地址的最高有效 10 位索引,因此它有 2 10个条目并指向 2 10 个不同的页表(即,在第二级)。
每2次电平表再次可以通过(中间)10位和相应的条目将持有的实际页帧号来索引。
我的问题是:
是的,一切都是正确的。如果只有一层页表且每个条目 4 个字节,则页表将具有
4 GiB (maximal physical address space) / 4 KiB (size of one page frame) * 4 Bytes = 4 MiB
Run Code Online (Sandbox Code Playgroud)
访问物理地址就像
(page table entry)->(offset)
Run Code Online (Sandbox Code Playgroud)
为了减小这个大页表的大小,采用了多级分页方案,将大小减小到
2^10 Bytes * 4 + 2^10 Bytes * 4 = 8 KiB
Run Code Online (Sandbox Code Playgroud)
并将虚拟地址的分辨率更改为物理地址
(page directory entry)->(page table entry)->(offset)
Run Code Online (Sandbox Code Playgroud)
这可以节省一些字节(4 MiB - 8 KiB),但有一个缺点:需要一个额外的内存引用才能将虚拟地址转换为物理地址。这里,TLB(翻译后备缓冲区)发挥作用。它是一个(与 L1 缓存相比)小型缓存,存储虚拟地址与硬件中物理地址的关联。这里使用了特殊的硬件,类似于哈希表(std::unordered_map
在 C++ 标准库中),不同之处在于它是在硬件中实现的,因此速度更快。
这是 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
。
归档时间: |
|
查看次数: |
1997 次 |
最近记录: |