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