2012-06-06 3 views
6

저는 KVM 관련 작업을 해왔으며 알아낼 수없는 몇 가지 질문을 가지고 있습니다.KVM이 인터럽트를 처리하는 방법

> 우리가 알다시피 일반적으로 외부 인터럽트는 VMexit을 유발하고 하이퍼 바이저는 게스트 용인 경우 가상 인터럽트를 주입합니다. 그러면 어떤 irq가 주입 될 것인가? (나는 게스트 IDT를 인덱싱하기위한 인터럽트 벡터를 의미한다)? KVM이 이것 (호스트 IRQ를 게스트 가상 IRQ와 연결)에 대해 어떻게 알 수 있습니까?

2> 게스트에 할당 된 장치의 경우 하이퍼 바이저가 해당 IRQ를 게스트에게 전달합니다. 코드를 추적하여, 나는 호스트 IRQ가 손님의 (나는 인터럽트 벡터를 의미한다)와 다르다는 것을 알았다. KVM이 게스트가 사용해야하는 인터럽트 벡터를 구성하는 방법은 무엇입니까?

3> VMCS의 일부 필드를 설정하여 외부 인터럽트를 종료하지 않도록 설정 한 경우 실제 인터럽트 중에 어떤 일이 발생합니까? CPU가 응답 인터럽트를 위해 게스트 IDT를 사용합니까? 그렇다면 KVM이 게스트 용으로 다른 IDT를 사용하도록 CPU를 리디렉션 할 수 있습니까?

4> 게스트 IDT는 어디에 있습니까? 그것은 vcpu 및 레지스터 (IDTR 포함)를 초기화하는 동안 qemu에 의해 구성됩니까?

정말 내 질문에 답할 수 있기를 바랍니다. 나는 매우 감사 할 것입니다.

감사

답변

2

1 코드는 irq_comm.c에서 매우 복잡하다. 게스트 벡터의 경우 하이퍼 바이저가 게스트의 PCI 구성 공간을 트래핑하고 모니터링합니다 (실제로 QEMU에서 수행됩니다 - 예를 들어 kvm_msi_update 참조 - KVM의 syscall이 데이터로이를 업데이트 함).

3- 예. 다른 IDT를 설정하려면 VMCS에서 IDTR 필드를 변경해야합니다.

4- 게스트 IDT는 게스트 코드로 구성됩니다. QEMU/KVM은 직접 관련되지 않습니다. 게스트 IDTR에 대한 변경 사항을 모니터하기 위해 LIDT를 트랩하도록 실행 제어를 구성해야합니다.

ASPLOS'12에서 ELI를 구현하려고하는 것 같습니다. 오프라인으로 문의 (제 2 저자 - NA).

관련 문제