3

我正在寻找一种方法来捕获 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() ?

4

1 回答 1

1

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

于 2015-12-14T03:47:11.790 回答