2013-08-28 4 views
3

kvm 소스의 특정 gfn에서 "read"를 잡을 방법을 찾고 있습니다.spte를 매핑 해제하는 방법?

PT_WRITABLE_MASK를 사용하여 쓰기 비트를 뒤집어서 지정된 페이지에 대한 쓰기 권한을 제거하는 것처럼 보입니다. 따라서 트래핑은 씁니다.

rmap_write_protect(kvm, gfn) --> kvm_mmu_rmap_write_protect(kvm, gfn, slot) 

트래핑 읽기의 경우 해당 플래그 PM_PRESENT_MASK가 표시됩니다. 따라서 아마도 한 가지 방법은 위와 비슷한 wrapper 루틴을 작성하여 read (present)와 write bits를 뒤집을 수 있습니다. 아니면 단지 아래 함수를 사용하여 spte를 삭제할 수 있을까요? drop_spte()

위의 방법 중 하나를 사용한 후에 kvm_flush_remote_tlbs()가 필요합니까?

+0

문제에 대해 더 알아 보았습니까? 진전이 있었다면 질문을 업데이트하는 것이 좋은 생각 일 수 있습니다. 당신이 제안한 다양한 접근 방법을 시도해 보셨습니까? 작은 테스트를 통해 다른 사람들이 당신을 도울 수 있습니다. 마지막으로 몇 가지 질문이있는 것 같습니다. 그냥 하나만 좁힐 수 있니? –

답변

1

kvm_flush_remote_tlbs이 필요합니다. 게스트 페이지 양식을 작성하거나 보호하더라도 현재 CPU의 매핑이 다른 CPU tlbs에 캐시 될 수 있기 때문입니다. 게스트가 특정 gfn에 액세스하려고 할 때마다 drop_spte를 수행 한 후 호스트에 트랩합니다. EPT의 해당 항목은 __direct_map 함수에서 업데이트됩니다. 모든 접근에 대해 함정을 원한다면, kvm이 그런 매핑을 생성하는 것을 막아야한다. 대신에 emulate_instruction을 호출하여 kvm에서 그 명령어를 에뮬레이트 할 수있다.