我正在寻找一种方法来捕捉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()?
答案 0 :(得分:1)
kvm_flush_remote_tlbs
是必需的,因为即使您从当前CPU写保护或删除客户页面,它们的映射也可能缓存在其他CPU tlbs中。在guest虚拟机尝试访问特定gfn时执行drop_spte后,它将陷入主机。 EPT中的相应条目在__direct_map
函数中更新。如果你想在每次访问时都有陷阱,你应该阻止kvm创建这样的映射,而你可以通过调用emulate_instruction
来模拟kvm中的那条指令。