我正在尝试通过跟踪一段时间内的页面错误来编写一个玩具工作集估计器。每当页面出现故障时,我想记录它被触摸过。当我试图跟踪对已经存在的页面的访问时,该方案就崩溃了。如果在没有触发故障的情况下读取或写入页面,我将无法跟踪访问。
那么,我希望能够在页面访问时导致“轻量级”错误。我在某个时候听说过一些方法,但我不明白为什么它会起作用,所以它并没有留在我的脑海里。可能有点脏?
我正在尝试通过跟踪一段时间内的页面错误来编写一个玩具工作集估计器。每当页面出现故障时,我想记录它被触摸过。当我试图跟踪对已经存在的页面的访问时,该方案就崩溃了。如果在没有触发故障的情况下读取或写入页面,我将无法跟踪访问。
那么,我希望能够在页面访问时导致“轻量级”错误。我在某个时候听说过一些方法,但我不明白为什么它会起作用,所以它并没有留在我的脑海里。可能有点脏?
您可以使用mprotect
with PROT_NONE
(“无法访问页面”)。然后对给定页面的任何访问都会导致错误。
执行此操作的常用方法是简单地清除页面的“当前”位,同时将页面留在内存中并保留必要的内核数据结构,以便内核知道这一点。
但是,根据所讨论的体系结构,您可能有更好的选择 - 例如,在 x86 上,只要 PTE 用于线性地址转换,就会设置一个“已访问”标志(PTE 中的第 5 位)。您可以随时简单地清除该位,硬件会将其设置为记录页面被触摸。
使用这些方法中的任何一种,您都需要从 TLB 中清除该页面的缓存翻译 - 在 x86 上,您可以使用该INVLPG
指令。