Cum manipulează KVM întreruperea fizică?

Eu lucrez la optimizarea KVM pentru IO-urile VM-urilor. Am citit codurile KVM, de obicei întreaga întrerupere fizică va provoca VMexit și va intra în KVM. Apoi IDT-ul gazdei se va ocupa de întreruperea fizică corespunzătoare. Întrebarea mea este că modul în care KVM decide dacă va injecta o întrerupere virtuală în invitat sau nu? și în ce situație va injecta o întrerupere virtuală pentru oaspete?

Mulțumiri

5

2 răspunsuri

În Documentația kvm este vorba despre ceea ce se spune când intervarea virtuală poate fi injectată. Aici este linkul http://os1a.cs.columbia.edu/ LXR/sursa/Documentation/kvm/api.txt
uita-te la numărul de linie 905.
Structura stru kvm_run cred că dă controlul aplicației asupra modului în care aceasta face VM behave.Use cscope și căutați stringul request_interrupt_window în codul sursă. Veți înțelege cum văd kvm când să introduceți invitația pentru injectarea unui interupt. De asemenea, treceți prin fișierul api.txt este foarte util.

Noroc


EDITATĂ Iată un exemplu de gazdă de injectare care intervine în invitat Să presupunem că a apărut o eroare de pagină în GUEST VM

  • this causes a VMEXIT
  • Hypervisor/KVM handles the VMEXIT
  • Its sees the reason for VMEXIT through VMCS control structure and find that there was page fault.
  • The host/KVM is responsible for memory virtualization, so it check to see if the page fault was caused
    • because the page was not allocated to the GUEST in which case it calls alloc_page in the HOST kernel and does a VMENTRY to resume GUEST execution.
    • Or the mapping was removed by the GUEST OS, in this case the KVM uses a VMCS control structure as a communication medium to inject a virtual interupt no 14 which causes the GUEST kernel to handle page fault.

Acesta este un exemplu de introducere interferenta virtuala a gazdei. Desigur, există o mulțime de alte modalități/motive pentru a face acest lucru Puteți configura configurația VMCS pentru a face invitația să facă un VMEXIT după ce a executat FIECARE INSTRUCȚIUNE acest lucru se poate face folosind FLAGUL MONITOR TRAP.

2
adăugat

Cred că vă referiți la întreruperi ale dispozitivului atribuite (și nu întreruperi emulate sau întreruperi virt-IO care nu sunt direcționate direct de la dispozitivul fizic către invitat). Pentru fiecare irq al dispozitivului atribuit, request_threaded_irq este apelat și înregistrează kvm_assigned_dev_thread pentru a fi invitat la fiecare întrerupere. După cum puteți vedea, atunci kvm_set_irq este apelat și așa cum este descris singura coalescing care are loc în cazul în care întreruperea este mascată. În întreruperile x86 pot fi mascate de rflags.if, mov-SS, din cauza TPR care nu permite ca întreruperea să fie livrată sau din cauza întreruperii în serviciu cu prioritate mai mare. KVM este obligată să urmeze definiția arhitecturii pentru a nu-i surprinde pe oaspeți.

1
adăugat