【问题标题】:Updating page table when an entry is evicted from TLB从 TLB 中逐出条目时更新页表
【发布时间】:2016-02-04 01:25:44
【问题描述】:

从 TLB 中逐出条目时是否更新页表?如果是这样,为什么?页表中更新了哪些信息?我认为当被驱逐的页面干净时不需要更新页表。

同理,页面在TLB中缓存(引入)时是否更新页表?

【问题讨论】:

  • 1.) 没有 2.) 标志/地址 3.) TLB 是用于保存在页表中的映射的缓存。所以来自页表的 VAPA 依赖可以缓存在 TLB 中
  • 通常,当 PTE 加载到 TLB(如果尚未设置)时,页表条目中的访问指示符会更新(在页表中)。即使在 TLB 命中时,脏指示器也会在写入时更新。 (即,大多数 TLB 都是直写的。)支持回写 TLB 是可能的,这对于每个虚拟地址标签关联多个 PTE 的 TLB 来说可能是可取的。
  • @PaulA.Clayton,谢谢你的回答。一个问题只是为了更好地理解这一点。为什么需要在TLB加载时更新页表PTE中的访问指示字段?换句话说,访问指示符字段在什么情况下会有帮助?

标签: operating-system cpu-architecture virtual-memory tlb page-tables


【解决方案1】:

硬件页表遍历器(例如为 x86 定义的)可以在加载页表条目 (PTE) 的过程中修改访问和修改的指示符。由于 PTE 可以在非写入未命中时按需加载,因此在 PTE 已加载到 TLB 之后,修改的指示符可能会被更改。 (也可以将 PTE 预取到 TLB 中,在这种情况下,甚至可能需要在 PTE 插入 TLB 后设置访问指示符。传统的集群 TLB 条目,每个条目存储多个 PTE单个标签(如常规内存缓存的子块)自然可以从预取与标签关联的其他页面中受益,因为它不涉及额外的存储(即,这种预取没有缓存污染影响)并且相邻的 PTE 存储在一个已经从内存中获取的对齐块(对于典型的多级页表)。)

TLB 通常使用直写策略。这具有最近使用 PTE 所在的缓存块的优点。它还可以避免在清除访问位或脏位时使用处理器间中断。由于 TLB 通常不连贯,因此使用回写会使软件强制连贯性(当操作系统清除访问或脏位时)更加复杂。

某些硬件 TLB 管理架构不支持硬件设置访问和脏指标。相反,会生成一个异常,软件会处理这些特殊情况。由于设置这些指标并不像更改地址转换或权限那样少见,因此在不需要操作系统参与的情况下这样做可能会有一些优势。

(脏指示符用于允许操作系统在从内存中删除页面时避免(不必要地)写回不脏的页面。访问指示符用于支持(通常基于新近度)page replacement algorithm in操作系统。)

【讨论】:

  • 太棒了!非常有帮助。因此操作系统使用访问的指标进行页面替换管理。现在我明白了为什么当 PTE 缓存在 TLB 中时会更新 PTE 的访问指标。我不明白的是当 PTE 从 TLB 中驱逐时更新访问的指标。这对我来说似乎有点多余。
  • @aminfar 通常 TLB 是直写的,因此当 PTE 从 TLB 中逐出时不会更新内存。回写 TLB 理论上是可能的,在这种情况下,如果 PTE 发生更改,则会在从 TLB 驱逐时更新内存中的 PTE。
猜你喜欢
  • 2019-05-13
  • 2021-09-04
  • 1970-01-01
  • 2018-08-08
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2015-07-29
相关资源
最近更新 更多