【问题标题】:Can Intel processors delay TLB invalidations?英特尔处理器可以延迟 TLB 失效吗?
【发布时间】:2011-10-15 01:51:27
【问题描述】:

这参考了 InteI 的软件开发人员手册(订单号:325384-039US 2011 年 5 月),第 4.10.4.4 节“延迟无效”描述了 TLB 条目无效的潜在延迟,这可能会在访问其分页的内存时导致不可预知的结果-结构条目已更改。

手册说... “在某些情况下,必要的失效可能会延迟。软件开发- 操作人员应该明白,在修改分页结构条目之间 和执行第 4.10.4.2 节中推荐的无效指令, 处理器可以使用基于旧值或新值的转换 分页结构条目。以下项目描述了一些潜在的后果 延迟失效的quences: 如果修改了分页结构条目以将 R/W 标志从 0 更改为 1,则写入 访问由该条目控制转换的线性地址可能或 可能不会导致页面错误异常。"

让我们假设一个简单的情况,其中页面结构条目被修改(r/w 标志从 0 翻转到 1)以用于线性地址,然后立即调用相应的 TBL 无效指令。我的问题是——作为 TLB 延迟失效的后果,即使在调用 TLB 失效后对相关线性地址的写访问没有错 (页面错误)?

还是说“延迟失效”只能在页面结构发生变化的线性地址没有发出“失效”指令的情况下才会导致不可预知的结果?

【问题讨论】:

  • 在修改分页结构入口和执行无效指令之间 ← 很清楚,不是吗?
  • 我错误地解释了英特尔手册的描述,因此陷入了混乱。实际上,该手册描述了在页表结构更新后为了获得性能优势而进行的“故意”延迟。一旦发出“无效”指令,那么之后就没有“延迟”的问题了。

标签: tlb osdev cpu-cache page-fault


【解决方案1】:

TLB 透明地乐观地不会因 CR3 更改而取消缓存。 TLB 条目用地址空间的唯一标识符标记并留在 TLB 中,直到它们被错误的进程触及(在这种情况下 TLB 条目被丢弃)或地址空间被恢复(在这种情况下TLB 在地址空间变化时被保留)。

这一切对 CPU 来说都是透明的。您的程序(或操作系统)应该无法区分此行为与 TLB 实际因 TLB 失效而失效,除非通过以下方式:

  • A) 计时 - 即 TLB 乐观地不取消缓存更快(这就是他们这样做的原因)
  • B) 在某些极端情况下,这种行为有些未定义。如果您修改您所在的代码页或触摸刚刚更改的内存,TLB 的旧值可能仍然存在(即使在 CR3 更改后)。

解决方案是:

  • 1) 通过 invlpg 指令强制 TLB 更新。这会清除 TLB 条目,在下一次触摸页面时触发 TLB 读入。
  • 2) 通过 CR0 寄存器禁用和重新启用分页。
  • 3) 通过 CR0 中的缓存禁用位或在 TLB 的所有页面上将所有页面标记为不可缓存(标记为不可缓存的 TLB 条目在使用后会自动清除)。
  • 4) 更改代码段的模式。

请注意,这是真正未定义的行为。过渡到 SMM 可能会使 TLB 无效,也可能不会,从而使这种情况处于竞争状态。不要依赖这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 2019-03-19
    • 2012-01-01
    • 2020-06-24
    • 2011-01-08
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多