【问题标题】:TLB usage with multiple page sizes in x86_64 architecturex86_64 架构中多页大小的 TLB 使用情况
【发布时间】:2012-11-04 02:11:56
【问题描述】:

有人知道 TLB(L1 和 L2)是否支持在现代 x86_64 微处理器(Intel SandyBridge、AMD Bulldozer)中同时访问多个页面大小? x86 核心管道是否向 MMU 提供有关页面大小的信息?

最好的问候,

亚历克斯

【问题讨论】:

  • “同时访问”是什么意思?在 TLB 的上下文中,“L1”和“L2”是什么意思?这些通常用于指代缓存,而不是 TLB。
  • 在现代 x86 处理器中
  • 在现代 x86 处理器中也有双层 tlb。例如,在 AMD 推土机中,有 L1 DTLB 32 入口、全关联和 L2 TLB 1024 入口 8 路关联。
  • 好的,我明白你的意思了。您的问题的答案是 100% 依赖于实现。无法保证 Sandybridge 的行为与 Ivybridge 或 Nehalem 相同。无法保证 AMD 的行为会与其中任何一个相同。
  • 对了,“支持”是什么意思? “同时”是什么意思?这是否意味着跨越页面边界的单一访问?这是否意味着在操作系统中配置多个页面大小?

标签: x86 x86-64 tlb mmu


【解决方案1】:

这不是 TLB 允许什么的问题,而是架构允许什么的问题。该架构表明,您可以在同一页面层次结构中混合小 (4k)、大 (2M) 和大 (1G) 页面,方法是在适当级别的页面目录条目中设置 PS 位。

并非所有级别的 TLB 都必须能够缓存各种大小的页面,但这不应该阻止您混合页面。

现在,在 MMU 之前的 x86 管道中没有任何东西实际上需要有关页面大小的数据。这都是在页面层次结构本身中编码的。


关于页面拆分,如果您在地址 x 处有一个页面边界,并且您有一个从 x - 1 开始的大于 1 字节宽的内存访问,它将访问两个页面。即使两个页面的大小不同,这也可以工作。

【讨论】:

  • 实际上,当访问序列中有多个页面大小时,我对 TLB 行为感兴趣。更准确地说,我想知道在一系列 4k 访问之后出现 2M 访问时它是否会刷新。我完全理解它是一个依赖于 TLB 本身的实现(x86_64 可以在没有 TLB 的情况下实现)。
  • 如果翻译请求不包含有关其页面大小的信息,则无法在 tlb 中检测用于关联搜索的标记位(标记位应等同于页码)。
  • 重新发表您的第一条评论,这不仅取决于实现,还取决于其他线程正在做什么,因为 TLB 是共享的。请注意,还有各种可能导致 TLB 刷新的软件可能不可见的微体系结构事件。答案是在我熟悉的大多数 Intel 处理器中,访问不同大小的页面不会触发 TLB 刷新。
  • 关于您的第二条评论,TLB 应该将页面大小保留为 TLB 的一部分(例如,通过保留标签 + 掩码以进行地址匹配)。每个线性地址只匹配一个物理地址,所以如果一个线性地址命中一个具有一种大小的 TLB 条目,它只会命中那个条目。应该没有混淆。
  • 我认为您的最后评论完全回答了原始问题。那是关于页面大小的 tlb 支持信息,并根据此标记掩码应用。因此 tlb 中可以同时存在不同的页面大小条目,并且不需要从 LSU 到 TLB 的额外信息。感谢您的讨论。
【解决方案2】:

TLB 通常分为两部分:代码和数据。 这些中的每一个都可以分为多个级别,但通常是 L1,也可能是 L2。每个级别可能支持单一页面大小或混合页面大小。

例如,在我的处理器上,我有一个用于 2mb/4mb 页面的混合 I-L1 TLB,一个用于 2mb/4mb 页面的混合的 D-L1 TLB,一个用于 4kb 页面的 I-L1 TLB,一个 D-L1 TLB用于 4kb 页面,最后是用于 4kb 页面的 D-L2 TLB。

当 TLB 支持混合页面时,TLB 存储与特定虚拟地址标签关联的页面大小。

当 TLB 级别的每个页面大小有多个单独的缓存时,由于页面大小未知,因此会并行执行查找。

在任何一种情况下,如果 L1 TLB 未命中,则会在尝试页表遍历之前检查 L2。

既然细节已经解决,我们终于可以回答您的问题了。您可以同时使用多个页面大小,但是它们永远不能重叠(操作系统不会让您在同一位置映射 2 个虚拟页面)。事实上,内核在内部使用多种页面大小来处理各种事情。

根据操作系统的不同,在用户空间进程中使用多个页面大小可能很容易,也可能很痛苦。有关这方面的更多详细信息,请参阅 Linux Huge page support 和 Windows Large Pages support。其他操作系统将在其文档中对此进行详细说明。

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2016-01-24
    • 2013-04-21
    • 2012-02-18
    相关资源
    最近更新 更多