2013-08-28 53 views
3

我正在寻找一种方法来捕捉kvm源中特定gfn上的“阅读”。如何取消映射spte?

看起来功能堆栈通过使用PT_WRITABLE_MASK翻转写入位来移除给定页面的写入权限。因此陷阱写道。

rmap_write_protect(kvm, gfn) --> kvm_mmu_rmap_write_protect(kvm, gfn, slot) 

对于捕获读取,我看到等价标志PM_PRESENT_MASK。因此,一种方法可能是编写类似于上面的包装例程来翻转读取(存在)和写入位。或者只是使用下面的函数来删除spte而已? drop_spte()

以上两种方法之一是否需要kvm_flush_remote_tlbs()?

+0

您是否发现了有关您的问题的更多信息?如果你取得了一些进展,更新这个问题可能是一个好主意,因为它可以解决问题。你有没有尝试过你提出的各种方法?一个小测试可能会让其他人更容易帮助你。最后,这听起来像你可能有几个问题。你能缩小到只有一个吗? –

回答

1

kvm_flush_remote_tlbs是必需的,因为即使您写保护或删除当前CPU的访客页面,它们的映射也可能会缓存到其他CPU tlbs中。每当访客尝试访问特定的gfn时,在您执行drop_spte后,它将陷入主机。 EPT中的对应条目在__direct_map函数中更新。如果你想陷入每次访问,你应该阻止kvm创建这样的映射,而你可以通过调用emulate_instruction来模拟kvm中的那条指令。