使用多个页面大小特定的 TLB 进行地址转换
Address translation with multiple pagesize-specific TLBs
对于 Intel 64 和 IA-32 处理器,对于独立的数据和代码,可能同时存在 4KB TLB 和大页面(2MB、1GB)TLB (LTLB)。在这种情况下地址转换如何工作?
- 如果知道不会发生连击,硬件是否能够简单地并行访问两者?
- 在 LTLB 中,条目将如何组织?我想,当条目最初是从页面结构条目填充时,LTLB 条目可能包含有关该条目的命中将如何进行的信息?
有人对当前的微体系结构有参考吗?
支持多种页面大小的 TLB 有多种可能的设计,权衡取舍很重要。但是,我只会简要讨论商用处理器中使用的那些设计(有关更多信息,请参见 this and this)。
一个紧迫的问题是如何在访问组关联 TLB 之前知道页面大小。要映射到物理地址的给定虚拟地址必须按如下方式分区:
-----------------------------------------
| page number | page offset |
-----------------------------------------
| tag | index | page offset |
-----------------------------------------
索引用于确定要查找TLB的哪一组,标签用于确定该组中是否有匹配的条目。但是只给定一个虚拟地址,如果不访问页面 table 条目就无法知道页面大小。如果页面大小未知,则无法确定页面偏移量的大小。这意味着构成索引和标记的位的位置是未知的。
大多数商业处理器使用两种设计中的一种(或两种)来处理这个问题。第一种是使用并行 TLB 结构,其中每个 TLB 仅指定用于特定大小的页面条目(这并不精确,请参见下文)。并行查找所有 TLB。可以是一次命中,也可以是全部未命中。也有可能发生多次命中的情况。在这种情况下,处理器可能会选择缓存条目之一。
第二种是使用fully-associative TLB,其设计如下。令 POmin 表示体系结构支持的最小页面大小的页面偏移大小。令 VA 表示虚拟地址的大小。在全关联高速缓存中,地址被划分为页面偏移量和标记;没有索引。令 Tmin 表示 VA - POmin。 TLB 的设计使得每个条目都包含一个大小为 Tmin 的标记,而不管该 TLB 条目中缓存的页面 table 条目的页面大小如何。
虚拟地址的 Tmin 最高有效位被提供给全关联 TLB 的每个入口处的比较器以比较标签(如果入口有效).对比如下。
| M |
|11|0000| | the mask of the cached entry
-----------------------------------------
| T(x) |M(x)| | some bits of the offset needs to be masked out
-----------------------------------------
| T(x) | PO(x) | partitioning according to actual page size
-----------------------------------------
| T(min) | PO(min) | partitioning before tag comparison
-----------------------------------------
TLB 中的每个条目都包含一个名为标记掩码 的字段。令 Tmax 表示架构支持的最大页面大小的标记大小。则标记掩码的大小 M 为 Tmin - Tmax。当页面 table 条目缓存在 TLB 中时,掩码的设置方式使得当它与给定标签的相应最低有效位(Tmin ),属于页面偏移字段的任何剩余位都将变为全零。此外,条目中存储的标签附加了足够数量的零,因此其大小为 Tmin。因此,掩码的某些位将为零,而其他位将为 1,如上图所示。
现在我将讨论几个例子。为简单起见,我假设没有超线程(可能的设计选项包括共享、静态分区和动态分区)。 Intel Skylake uses the parallel TLB design for both the L1 D/I TLB and the L2 TLB. In Intel Haswell, 1 GB pages are not supported by the L2 TLB. Note that 4 MB pages use two TLB entires (with replicated tags). I think that the 4 MB page table entries can only be cached in the 2 MB page entry TLB. The AMD 10h and 12h processors use a fully-associative L1 DTLB, a parallel L2 DTLB, a fully-associative parallel L1 ITLB, and an L2 ITLB that supports only 4 KB pages. The Sparc T4 处理器使用全关联 L1 ITLB 和全关联 L1 DTLB。 Sparc T4中没有L2 TLB。
对于 Intel 64 和 IA-32 处理器,对于独立的数据和代码,可能同时存在 4KB TLB 和大页面(2MB、1GB)TLB (LTLB)。在这种情况下地址转换如何工作?
- 如果知道不会发生连击,硬件是否能够简单地并行访问两者?
- 在 LTLB 中,条目将如何组织?我想,当条目最初是从页面结构条目填充时,LTLB 条目可能包含有关该条目的命中将如何进行的信息?
有人对当前的微体系结构有参考吗?
支持多种页面大小的 TLB 有多种可能的设计,权衡取舍很重要。但是,我只会简要讨论商用处理器中使用的那些设计(有关更多信息,请参见 this and this)。
一个紧迫的问题是如何在访问组关联 TLB 之前知道页面大小。要映射到物理地址的给定虚拟地址必须按如下方式分区:
-----------------------------------------
| page number | page offset |
-----------------------------------------
| tag | index | page offset |
-----------------------------------------
索引用于确定要查找TLB的哪一组,标签用于确定该组中是否有匹配的条目。但是只给定一个虚拟地址,如果不访问页面 table 条目就无法知道页面大小。如果页面大小未知,则无法确定页面偏移量的大小。这意味着构成索引和标记的位的位置是未知的。
大多数商业处理器使用两种设计中的一种(或两种)来处理这个问题。第一种是使用并行 TLB 结构,其中每个 TLB 仅指定用于特定大小的页面条目(这并不精确,请参见下文)。并行查找所有 TLB。可以是一次命中,也可以是全部未命中。也有可能发生多次命中的情况。在这种情况下,处理器可能会选择缓存条目之一。
第二种是使用fully-associative TLB,其设计如下。令 POmin 表示体系结构支持的最小页面大小的页面偏移大小。令 VA 表示虚拟地址的大小。在全关联高速缓存中,地址被划分为页面偏移量和标记;没有索引。令 Tmin 表示 VA - POmin。 TLB 的设计使得每个条目都包含一个大小为 Tmin 的标记,而不管该 TLB 条目中缓存的页面 table 条目的页面大小如何。
虚拟地址的 Tmin 最高有效位被提供给全关联 TLB 的每个入口处的比较器以比较标签(如果入口有效).对比如下。
| M |
|11|0000| | the mask of the cached entry
-----------------------------------------
| T(x) |M(x)| | some bits of the offset needs to be masked out
-----------------------------------------
| T(x) | PO(x) | partitioning according to actual page size
-----------------------------------------
| T(min) | PO(min) | partitioning before tag comparison
-----------------------------------------
TLB 中的每个条目都包含一个名为标记掩码 的字段。令 Tmax 表示架构支持的最大页面大小的标记大小。则标记掩码的大小 M 为 Tmin - Tmax。当页面 table 条目缓存在 TLB 中时,掩码的设置方式使得当它与给定标签的相应最低有效位(Tmin ),属于页面偏移字段的任何剩余位都将变为全零。此外,条目中存储的标签附加了足够数量的零,因此其大小为 Tmin。因此,掩码的某些位将为零,而其他位将为 1,如上图所示。
现在我将讨论几个例子。为简单起见,我假设没有超线程(可能的设计选项包括共享、静态分区和动态分区)。 Intel Skylake uses the parallel TLB design for both the L1 D/I TLB and the L2 TLB. In Intel Haswell, 1 GB pages are not supported by the L2 TLB. Note that 4 MB pages use two TLB entires (with replicated tags). I think that the 4 MB page table entries can only be cached in the 2 MB page entry TLB. The AMD 10h and 12h processors use a fully-associative L1 DTLB, a parallel L2 DTLB, a fully-associative parallel L1 ITLB, and an L2 ITLB that supports only 4 KB pages. The Sparc T4 处理器使用全关联 L1 ITLB 和全关联 L1 DTLB。 Sparc T4中没有L2 TLB。