Intel的Sandy Bridge CPU中TLB的大小是如何确定的?

How is the size of TLB in Intel's Sandy Bridge CPU determined?

wiki网页(https://en.wikipedia.org/wiki/Sandy_Bridge)提到Data TLB对于4KB、2MB和1GB的页面分别有64、32和4个条目。

我发现这些数字很难理解。 Sandy Bridge有一个48位的虚拟地址,也就是说对于4K页,可以有2^36页,对于2MB和1GB页,应该有2^27和2^18页。如果TLB对于4K页有64个表项,每个表项的大小应该不少于6+36=42位。为什么 2M 页只有 32 个条目,而不是 2^15 (42-27) 个条目?

我知道在 TLB 条目中会有额外的位用于控制目的。但是 space 不应该对不同的页面大小保持不变吗?

因为它们不同 TLB。
在我的 Haswell 上使用 EAX=2 执行 cpuid 并解码 TLB 描述符得到:

Instruction TLB:
              2M/4M pages, fully associative, 8 entries
              4KByte pages, 8-way, 64 entries

Data TLB:
              2M/4M pages, 4-way, 32 entries and a separate array with 1 GByte pages, 4-way, 4 entries
              4 KByte pages, 4-way, 64 entries

Shared 2nd-Level TLB:
              4 K/2M pages, 8-way, 1024 entries

TLB 缓存是高度 专用CAM 具有固定布局,它不是具有通用布局的暂存存储器。

一些 TLB 可以处理超过一个页面大小,但如果信息以通用格式缓存,这些都是权衡。
让不同的 TLB 处理不同的页面大小可以提高缓存命中率,就像拥有 DTLB 和 ITLB 一样。

数据缓存的工作方式不同,因为它们不缓存信息,它们缓存没有布局的数据,这就是为什么以 KiB 为单位给出它们的大小是有意义的,但它不适用于处理结构化信息的缓存。