【问题标题】:How to unmap a spte?如何取消映射 spte?
【发布时间】:2013-08-30 21:39:05
【问题描述】:

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

【问题讨论】:

  • 您是否进一步发现了您的问题?如果您取得了任何进展,更新问题可能是一个好主意,因为它会影响问题。您是否尝试过您提出的各种方法?一个小测试可能会让其他人更容易帮助你。最后,听起来您可能有几个问题。你能把它缩小到一个吗?

标签: linux-kernel virtualization qemu kvm


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多