如何取消映射spte?

时间:2013-08-28 00:00:32

标签: linux-kernel virtualization qemu kvm

我正在寻找一种方法来捕捉kvm源中特定gfn的“读取”。

看起来函数堆栈通过使用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()?

1 个答案:

答案 0 :(得分:1)

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