diff --git a/source/chapter4/3sv39-implementation-1.rst b/source/chapter4/3sv39-implementation-1.rst index c6d43b96..9a90d5ec 100644 --- a/source/chapter4/3sv39-implementation-1.rst +++ b/source/chapter4/3sv39-implementation-1.rst @@ -334,7 +334,7 @@ SV39 多级页表的硬件机制 在 SV39 中,如果使用了一级页索引就停下来,则它可以涵盖虚拟页号的高 :math:`9` 位为某一固定值的所有虚拟地址,对应于一个 :math:`1\text{GiB}` 的大页;如果使用了二级页索引就停下来,则它可以涵盖虚拟页号的高 :math:`18` 位为某一固定值的所有虚拟地址,对应于一个 :math:`2\text{MiB}` 的大页。以同样的视角,如果使用了所有三级页索引才停下来,它可以涵盖虚拟页号的高 :math:`27` 位为某一个固定值的所有虚拟地址,自然也就对应于一个大小为 :math:`4\text{KiB}` 的虚拟页面。 - 使用大页的优点在于,当地址空间的大块连续区域的访问权限均相同的时候,可以直接映射一个大页,从时间上避免了大量页表项的读写开销,从空间上降低了所需节点的数目。但是,从内存分配算法的角度,这需要内核支持从物理内存上分配三种不同大小的连续区域( :math:`4\text{KiB}` 或是另外两种大页),便不能使用更为简单的插槽式管理。权衡利弊之后,本书全程只会以 :math:`4\text{KiB}` 为单位进行页表映射而不会使用大页特性。 + 使用大页的优点在于,当地址空间的大块连续区域的访问权限均相同的时候,可以直接映射一个大页,从时间上避免了大量页表项的读写开销,从空间上降低了所需页表节点的数目。更为重要的是,使用大页可以显著减轻 TLB 的压力,提升 TLB 命中率,因为现在 TLB 中一个表项可以覆盖更大的内存空间了。这可以从整体上提高访存指令的执行速度,进而提升整体的 IPC 。但是,从内存分配算法的角度,这需要内核支持从物理内存上分配三种不同大小的连续区域( :math:`4\text{KiB}` 或是另外两种大页),便不能使用更为简单的插槽式管理。权衡利弊之后,本书全程只会以 :math:`4\text{KiB}` 为单位进行页表映射而不会使用大页特性。 那么 SV39 多级页表相比线性表到底能节省多少内存呢?这里直接给出结论:设某个应用地址空间实际用到的区域总大小为 :math:`S` 字节,则地址空间对应的多级页表消耗内存为 :math:`\frac{S}{512}` 左右。下面给出了详细分析,对此不感兴趣的同学可以直接跳过。