Как KVM обработва физическото прекъсване?

работя върху KVM оптимизация за IO на виртуални машини. Прочетох KVM кодовете, обикновено цялото физическо прекъсване ще предизвика VMexit и ще влезе в KVM. Тогава IDT на хоста ще обработи съответното физическо прекъсване. Въпросът ми е как KVM решава дали да инжектира виртуално прекъсване в госта или не? и при каква ситуация ще инжектира виртуално прекъсване на госта?

Благодаря


person user1073939    schedule 31.05.2012    source източник


Отговори (2)


В документацията на kvm това е, което се казва кога виртуалното прекъсване може да бъде инжектирано. Ето връзката http://os1a.cs.columbia.edu/lxr/source/Documentation/kvm/api.txt
вижте ред номер 905.
Структурата struct kvm_run според мен дава контрол на приложението за това как кара VM да се държи. Използвайте cscope и търсене за низа request_interrupt_window в изходния код, ще разберете как kvm вижда кога да влезе в госта за инжектиране на прекъсване. Също така прегледайте файла api.txt, той е много полезен.

наздраве

РЕДАКТИРАНО
Ето един пример за хост, който инжектира прекъсвания в госта.
Да приемем, че е имало грешка в страницата във виртуалната машина за ГОСТ.

  • това причинява VMEXIT
  • Hypervisor/KVM обработва VMEXIT
  • Той вижда причината за VMEXIT чрез VMCS контролна структура и открива, че е имало грешка на страницата.
  • 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.
    • Или съпоставянето е премахнато от GUEST OS, в този случай KVM използва VMCS контролна структура като комуникационна среда за инжектиране на виртуално прекъсване № 14, което кара ядрото GUEST да обработва грешка на страницата.

Това е един пример за хост, вмъкващ виртуално прекъсване. Разбира се, има много други начини/причини да го направите.
Можете всъщност да конфигурирате VMCS, за да накарате госта да направи VMEXIT след изпълнение на ВСЯКА ИНСТРУКЦИЯ, това може да се направи с помощта на ФЛАГА ЗА ПРИХВАНАНЕ НА МОНИТОРА.

person Deepthought    schedule 26.06.2012

Предполагам, че имате предвид присвоените прекъсвания на устройството (а не емулирани прекъсвания или прекъсвания на virt-IO, които не се препращат директно от физическото устройство към госта). За всяко irq на присвоеното устройство се извиква request_threaded_irq и регистрира kvm_assigned_dev_thread, който да бъде извикан при всяко прекъсване. Както можете да видите, след това се извиква kvm_set_irq и както е описано единственото обединяване, което се извършва, ако прекъсването е маскирано. В x86 прекъсванията могат да бъдат маскирани от rflags.if, mov-SS, поради TPR, който не позволява прекъсването да бъде доставено или поради прекъсване в услуга с по-висок приоритет. KVM е длъжен да следва дефиницията на архитектурата, за да не изненада госта.

person nadafu    schedule 07.06.2012