2012-05-31 3 views
5

VM의 IO에 대한 KVM 최적화 작업을하고 있습니다. KVM 코드를 읽었습니다. 일반적으로 모든 물리적 인 인터럽트가 VMexit을 일으키고 KVM에 들어갑니다. 그런 다음 호스트의 IDT가 해당 물리적 ​​인터럽트를 처리합니다. 내 질문은 KVM이 게스트에 가상 인터럽트를 주입할지 여부를 결정하는 방법입니다. 어떤 상황에서 게스트에게 가상 인터럽트를 주입합니까?KVM이 물리적 인터럽트를 처리하는 방법은 무엇입니까?

덕분에

답변

1

나는 당신이 (직접 게스트로 물리적 장치에서 전달되지 않습니다하지 에뮬레이트 인터럽트 또는 VIRT-IO 인터럽트) 할당 장치 인터럽트를 참조 같아요. 할당 된 장치의 각 irq에 대해 request_threaded_irq가 호출되고 모든 인터럽트시 호출 될 kvm_assigned_dev_thread를 등록합니다. 당신이 볼 수 있듯이 kvm_set_irq가 호출되고, 설명 된대로 인터럽트가 마스크 된 경우에만 병합이 수행됩니다. x86 인터럽트는 인터럽트가 전달되지 않거나 우선 순위가 더 높은 서비스의 인터럽트 때문에 TPR 때문에 rflags.if, mov-SS에 의해 마스크 될 수 있습니다. KVM은 게스트를 놀라게하지 않기 위해 아키텍처 정의를 따르도록되어 있습니다.

2

kvm의 문서에서 이것은 가상 인터럽트가 주입 될 수있는 때에 대해 말한 것입니다. 을 heres 링크 http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt
은 행 번호에 보기 (905) 내가 생각하는 구조체 kvm_run 구조는 VM behave.Use의 cscope를하게하고, 소스 코드에서 문자열 request_interrupt_window를 검색하는 방법에 응용 프로그램을 제어 할 수 있습니다
, 당신은 이해합니다 kvm이 인터 럽트를 주입하기 위해 손님을 입력하는 방법을 알 수 있습니다. 또한 api.txt 파일을 살펴보면 매우 유용합니다.

건배 여기
의 EDITED

게스트로 interrupts를 주입 호스트의 일례.
이는

  • 하이퍼 바이저/KVM은 VMEXIT를 처리하는 VMEXIT의 원인이되는 게스트 VM

    • 에서 페이지 오류가 있다고 가정
    • 그것은 VMCS 제어 구조를 통해 VMEXIT에 대한 이유를보고 있다는 것을 발견 페이지 오류. 이 페이지은 (는) HOST 커널에 alloc_page을 호출하고 작업을 수행하는 경우에 게스트에 할당되지 않았기 때문에 페이지 폴트가
      • 의 원인이 된 경우 확인 있도록
      • 호스트/KVM은 메모리 가상화에 대한 책임 VMENTRY를 사용하여 GUEST 실행을 다시 시작합니다.
      • 매핑이 게스트 운영 체제에 의해 제거되었습니다.이 경우 KVM은 VMCS 제어 구조를 사용하여 가상 인터럽트 아니요 14를 삽입하여 GUEST 커널이 페이지 오류를 처리하도록합니다.

    이 가상 매치를 중지 삽입 호스트의 일례이다. 물론 그렇게 할 수있는 다른 방법/이유가 많이 있습니다.
    실행 후 게스트가 VMEXIT을 수행하도록 VMCS를 구성 할 수 있습니다. 모든 지침 MONITOR TRAP FLAG를 사용하여 모든 지침을 수행 할 수 있습니다.

  • 관련 문제