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

Я работаю над оптимизацией KVM для ввода-вывода виртуальных машин. Я прочитал коды KVM, обычно все физические прерывания вызывают выход VM и переход в 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 дает приложению контроль над поведением виртуальной машины. для строки request_interrupt_window в исходном коде вы поймете, как kvm видит, когда вводить гостя для внедрения прерывания. Также просмотрите файл api.txt, это очень полезно.

Ваше здоровье

EDITED
Вот один пример того, как хост вводит прерывания в гостевую.
Предположим, что произошла ошибка страницы в гостевой виртуальной машине.

  • это вызывает VMEXIT
  • Гипервизор / 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, в этом случае KVM использует структуру управления VMCS в качестве средства связи для внедрения виртуального прерывания № 14, которое заставляет ядро ​​GUEST обрабатывать отказ страницы.

Это один из примеров того, как хост вставляет виртуальное прерывание. Конечно, есть много других способов / причин для этого.
Вы можете фактически настроить VMCS, чтобы гость выполнял VMEXIT после выполнения КАЖДОЙ ИНСТРУКЦИИ, это можно сделать с помощью ФЛАГА ЛОВУШКИ МОНИТОРА.

person Deepthought    schedule 26.06.2012

Я предполагаю, что вы имеете в виду назначенные прерывания устройства (а не эмулируемые прерывания или прерывания виртуального ввода-вывода, которые напрямую не перенаправляются с физического устройства на гостя). Для каждого irq назначенного устройства вызывается request_threaded_irq и регистрирует kvm_assigned_dev_thread, который будет вызываться при каждом прерывании. Как вы можете видеть, затем вызывается kvm_set_irq и, как описано, единственное объединение, которое происходит, если прерывание замаскировано. В x86 прерывания могут маскироваться rflags.if, mov-SS из-за TPR, который не позволяет доставить прерывание, или из-за прерывания в обслуживании с более высоким приоритетом. KVM обязан следовать определению архитектуры, чтобы не удивлять гостя.

person nadafu    schedule 07.06.2012