对于Intel 64和IA-32处理器,无论是数据还是代码,都可能有4KB TLB和大页面(2MB,1GB)TLB(LTLB)。在这种情况下,地址转换如何工作?
任何人都提到当前的微观结构?
答案 0 :(得分:3)
TLB有许多可能的设计,支持多种页面大小,并且权衡很重要。但是,我只会简要讨论商用处理器中使用的那些设计(有关详情,请参阅this和this)。
一个直接的问题是如何在访问集合关联TLB之前知道页面大小。要映射到物理地址的给定虚拟地址必须按如下方式进行分区:
-----------------------------------------
| page number | page offset |
-----------------------------------------
| tag | index | page offset |
-----------------------------------------
索引用于确定要查找的TLB集合,并使用标记来确定该集合中是否存在匹配条目。但只给出一个虚拟地址,如果不访问页表项,则无法知道页面大小。如果页面大小未知,则无法确定页面偏移的大小。这意味着构成索引和标记的位的位置是未知的。
大多数商业处理器使用两种设计中的一种(或两者)来处理这个问题。第一种是使用并行TLB结构,其中每个TLB仅被指定用于特定大小的页面条目(这不精确,见下文)。所有TLB都是并行查找的。可以有一次击中或全部失误。还存在可能发生多次命中的情况。在这种情况下,处理器可以选择其中一个缓存的条目。
第二种是使用完全关联的TLB,其设计如下。设PO min 表示体系结构支持的最小页面大小的页面偏移量。设VA表示虚拟地址的大小。在完全关联的高速缓存中,地址被分区为页面偏移和标记;没有索引。令T min 表示VA-PO min 。设计TLB使得每个条目保持大小为T min 的标记,而不管该TLB条目中缓存的页表条目的页面大小。
虚拟地址的T min 最高有效位在完全关联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中的每个条目都包含一个名为标记掩码的字段。令T max 表示体系结构支持的最大页面大小的标记的大小。然后标签掩码的大小M是T min - T max 。当页面表条目被缓存在TLB中时,掩码的设置方式使得当它与给定标记的对应最低有效位(T min )进行按位和对应时,属于页面偏移字段的任何剩余位将变为全零。此外,存储在条目中的标记附加有足够数量的零,以使其大小为T min 。因此,掩码的某些位将为零,而其他位则为1,如上图所示。
现在我将讨论几个例子。为简单起见,我假设没有超线程(可能的设计选项包括共享,静态分区和动态分区)。 Intel Skylake对L1 D / I TLB和L2 TLB使用并行TLB设计。在Intel Haswell中,L2 TLB不支持1 GB页面。请注意,4 MB页面使用两个TLB entires(带有复制标记)。 我认为 4 MB页表条目只能缓存在2 MB页面条目TLB中。 AMD 10h and 12h处理器使用完全关联的L1 DTLB,并行L2 DTLB,完全关联的并行L1 ITLB和仅支持4 KB页面的L2 ITLB。 Sparc T4处理器使用完全关联的L1 ITLB和完全关联的L1 DTLB。 Sparc T4中没有L2 TLB。