【问题标题】:How can I force a page to fault, even if it is already in the tlb?如何强制页面出错,即使它已经在 tlb 中?
【发布时间】:2011-10-23 18:27:42
【问题描述】:

我正在尝试通过跟踪一段时间内的页面错误来编写一个玩具工作集估计器。每当页面出现故障时,我想记录它被触摸过。当我试图跟踪对已经存在的页面的访问时,该方案就崩溃了。如果在没有触发故障的情况下读取或写入页面,我将无法跟踪访问。

那么,我希望能够在页面访问时发生“轻量级”错误。我在某个时候听说过一些方法,但我不明白为什么它会起作用,所以它没有留在我的脑海里。可能有点脏?

【问题讨论】:

    标签: caching linux-kernel operating-system paging tlb


    【解决方案1】:

    执行此操作的通常方法是简单地清除页面的“当前”位,同时将页面留在内存中并保留必要的内核数据结构,以便内核知道这一点。

    但是,根据所讨论的体系结构,您可能有更好的选择 - 例如,在 x86 上,只要 PTE 用于线性地址转换,就会设置一个“已访问”标志(PTE 中的第 5 位)。您可以随时简单地清除该位,硬件会将其设置为记录页面被触摸。

    使用其中任何一种方法,您都需要从 TLB 中清除该页面的缓存翻译 - 在 x86 上,您可以使用 INVLPG 指令。

    【讨论】:

      【解决方案2】:

      您可以将mprotectPROT_NONE 一起使用(“无法访问页面”)。那么对给定页面的任何访问都会导致错误。

      【讨论】:

      • 我打算给我的内核打补丁,所以用户空间方法并不是我想要的,尽管我确信这种技术可以转化为内核内部的东西。接受。
      猜你喜欢
      • 2016-12-14
      • 2013-10-06
      • 2015-02-13
      • 2016-09-30
      • 2019-02-27
      • 2011-11-21
      • 2023-03-07
      相关资源
      最近更新 更多