我正在寻找一种方法来捕获kvm源代码中特定gfn上的"read“。
看起来函数栈通过使用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()?
发布于 2015-12-14 11:47:12
kvm_flush_remote_tlbs是必需的,因为即使您对来宾页面进行写保护或从当前CPU删除它,它们的映射也可能被缓存在其他CPU中。在您执行drop_spte之后,每当来宾尝试访问特定的gfn时,它都会捕获到主机。在__direct_map函数中更新EPT中的相应条目。如果您希望在每次访问时都陷入陷阱,则应该阻止kvm创建此类映射,而是可以通过调用emulate_instruction在kvm中模拟该指令。
https://stackoverflow.com/questions/18477321
复制相似问题